天天看點

Android面試題總結View的繪制流程及事件分發

View的繪制流程及事件分發

1、view繪制機制

measure()–>onMeasure(); layout()–>onLayout();    draw():

2、view事件分發機制:

主要由3個函數組成:

dispatchTouchEvent():進行事件分發;

onInterceptTouchEvent():用于事件攔截;

onTouchEvent():處理具體的事件,類似于OnTouchListener、OnClickListener

3、Activity跟Window之間的關系

1)每一個Activity中都包含一個Window對象,在Android中Window對象通常是由PhoneWindow來實作的。PhoneWindow将DecoreView設定為整個應用視窗的根View,DecoreView作為視窗界面的頂層視圖,封裝了一些視窗操作的基本方法。将要顯示的内容呈現在PhoneWindow上,我們的View的監聽事件都是由WindowMangerService來進行接收,并且通過Activity的對象來回調相應的onClickListener。在顯示上,DecorView将螢幕分成兩個部分:一個是titleView,另一個是ContentView。

2)Activity在onCreate時調用attach方法,在attach方法中會建立window對象。window對象建立時并沒有建立 DocerView 對象。使用者在Activity中調用setContentView,然後調用window的setContentView,這時會檢查DecorView是否存在,如果不存在則建立DecorView對象,然後把使用者自己的 View  添加到 DecorView 中。在Activity中的onCreate 方法中調用 setContentView,界面繪制并不是由 Activity 完成的,實際上是調用Window對象的 setContentView,是以說界面繪制全部是由Window類的實作類(PhoneWindow類)來完成的。

4、ANR在四大元件中的時間,場景

大緻可以對應到android四大元件中的三個(Activity、BroadcastReceiver和service)

1)KeyDispatchTiemout :最常見的一種類型,原因是View的按鍵事件或者觸摸事件在特定的時間(5秒)内無法得到響應。

2)BroadcastTimeout: 原因是BroadcastReceiver的onReceive()函數運作在主線程中,在特定的時間按(10秒)内無法完成處理。

3)ServiceTiemout : 比較少出現的一種類型,原因是Service的各個生命周期函數在特定時間(20秒)内完成處理。

場景:

1)應用程式UI線程存在耗時操作,例如在UI線程中進行網絡請求、資料庫操作或者檔案操作,可能會導緻UI線程無法及時處理使用者輸入等。當然在Android4.0之後,如果在UI線程中進行網絡操作,将會抛出NetworkOnMainThreadException異常。

2)應用程式的UI線程等待子線程釋放某個鎖,進而無法處理使用者的輸入。

3)耗時的動畫需要大量的計算工作,可能導緻CPU負載過量

5、OOM(記憶體洩露),如何避免

1)加載對象過大。

2)相應資源過多,來不及加載。

解決這些問題,有:

1)記憶體引用上做一些處理,常用的有軟引用。

2)記憶體中加載圖檔直接在記憶體中做處理(如邊界壓縮)

這個Glide\Fresco 圖檔架構可能封裝好了

3)動态回收記憶體

4)優化Delivk虛拟機的堆記憶體配置設定

5)自定義堆記憶體大小

6、抽象類跟接口的差別,接口的預設修飾符 ?

1)在抽象類中可以為部分方法提供預設的實作,進而避免在子類中重複實作它們,提高代碼的可重用性,這是抽象類的優勢所在;而接口中隻能包含抽象的方法。

 2)由于抽象類中允許加入具體的方法(即非抽象方法),是以擴充抽象類的功能,即向抽象類中添加一個具體的方法,不會對它的子類造成影響。而對于接口,一旦接口被公布,就必須非常穩定,因為随意在接口中添加抽象方法,會影響到所有的實作類,這些實作類要麼實作新增的抽象方法,要麼聲明為抽象類。

3)一個類隻能繼承一個直接的父類,這個父類有可能是抽象類;但一個類可以實作多個接口,這是接口的優勢所在。

java接口預設就是abstract的。

java接口本身預設是abstract的;可以是public的,也可以是friendly的,但不可以是private 的,不可以是protected的(否則通不過編譯)。

java接口裡的方法預設是abstract的,public 的;不可以private 的,不可以是protected 的。