1. 程式人生 > >android 深入淺出 群內“每日一問” 問答總結

android 深入淺出 群內“每日一問” 問答總結

永遠不變的就是變。

俗話說的好,環境改變人生。經常面對的是一群積極奮進的人,那麼你的心態和生活也會變的充滿鬥志。青春在於折騰,趁我們還年輕,拿出你的激情,踏著淚水載著夢,才能擁有自己的一片天空。

上上上週,有機會加入了一個比較小的andorid 開發群,群內活力充足,每日有不常見面試題,深入android 原始碼的問題,由群主發起,各路大神討論,為菜鳥(比如我)普及android知識。每日進步一點點,慢慢積累自己的財富~

本文收集題目來自:wing_Android 技術交流群(425983695),歡迎青春朝氣的你加入。

1.merge標籤的作用

如果出現靜態頁面載入也卡頓,一定是ui佈局的層次關係沒優化好,每增加一層佈局,就會延遲介面顯示。

<merge/> 標籤主要用於android UI介面結構的優化,可以減少多餘的層級,<merge/>多用於替換FrageLayout或者當一個佈局包含另一個時候。  <merge/>標籤可用於巢狀層的佈局,例如你的主佈局檔案為垂直佈局,引入一個垂直佈局include ,這個include佈局使用的最外層layout沒意義還會增加主佈局的層數,造成佈局載入慢。 使用<merge/>標籤,系統直接忽略merge節點,載入merge節點包含的其他控制元件。

2.view變化監聽器ViewTreeObserver的使用

幾個介面

interface  ViewTreeObserver.OnGlobalFocusChangeListener         
  //當在一個檢視樹中的焦點狀態發生改變時,所要呼叫的回撥函式的介面類   
interface  ViewTreeObserver.OnGlobalLayoutListener
   //當在一個檢視樹中全域性佈局發生改變或者檢視樹中的某個檢視的可視狀態發生改變時,所要呼叫的回撥函式的介面類  
interface  ViewTreeObserver.OnPreDrawListener
   //當一個檢視樹將要繪製時,所要呼叫的回撥函式的介面類   
interface  ViewTreeObserver.OnScrollChangedListener
   //當一個檢視樹中的一些元件發生滾動時,所要呼叫的回撥函式的介面類
  
interface  ViewTreeObserver.OnTouchModeChangeListener
   //當一個檢視樹的觸控模式發生改變時,所要呼叫的回撥函式的介面類
使用方法和點選事件類似

3.activity生命週期由誰呼叫,或者說由誰管理

activityManageService  (檢視原始碼可以看到)

4.什麼叫程序

程序是系統進行資源分配和排程的一個獨立單位,執行緒是CPU排程和分派的基本單位
程序和執行緒的關係:
(1)一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒。
(2)資源分配給程序,同一程序的所有執行緒共享該程序的所有資源。
(3)執行緒在執行過程中,需要協作同步。不同程序的執行緒間要利用訊息通訊的辦法實現同步。
(5)執行緒是指程序內的一個執行單元,也是程序內的可排程實體。
執行緒與程序的區別:
(1)排程:執行緒作為排程和分配的基本單位,程序作為擁有資源的基本單位。
(2
)併發性:不僅程序之間可以併發執行,同一個程序的多個執行緒之間也可以併發執行。
(3)擁有資源:程序是擁有資源的一個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於程序的資源。
(4)系統開銷:在建立或撤銷程序的時候,由於系統都要為之分配和回收資源,導致系統的明顯大於建立或撤銷執行緒時的開銷。但程序有獨立的地址空間,程序崩潰後,在保護模式下不會對其他的程序產生影響,而執行緒只是一個程序中的不同的執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉
就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但是在程序切換時,耗費的資源較大,效率要差些。

5.抽象類和介面的區別

抽象類可以有非抽象方法

抽象類需要繼承,且只能繼承一個。 介面需要實現所有 未實現的方法,可以實現多個介面。

6.群友葫蘆娃面試樂視題目

1.說說廣播有哪幾種啟動方式,區別是什麼 一是動態方式使用Context.registerReceiver()方法來註冊;
二是靜態方式,即在AndroidManifest.xml中通過<receiver> 。 2.service啟動方式和區別

Service的生命週期方法onCreate, onStart, onDestroy

有兩種方式啟動一個Service,他們對Service生命週期的影響是不一樣的。

1. 通過startService

 Service會經歷 onCreate -> onStart

 stopService的時候直接onDestroy

如果是呼叫者自己直接退出而沒有呼叫stopService的話,Service會一直在後臺執行。下次呼叫者再起來可以stopService。

2. 通過bindService

Service只會執行onCreate, 這個時候服務的呼叫者和服務繫結在一起

呼叫者退出了,Srevice就會呼叫onUnbind->onDestroyed所謂繫結在一起就共存亡了。並且這種方式還可以使得
呼叫方(例如)呼叫服務上的其他的方法。

3.handler機制 4.瞭解過什麼和螢幕適配和機型適配有關的 5.寫個排序

7.UI執行緒和工作執行緒區別

Ui執行緒是安卓的主執行緒,不能做耗時操作或聯網操作 主執行緒有內建looper,工作執行緒沒有 主執行緒就是一個looper執行緒, 子執行緒不能修改ui是因為viewroot有一個checkThread函式來檢查當前執行緒,如果是工作執行緒則丟擲異常  主執行緒的Looper,是在activityThread建立的

8.frgment意外銷燬怎麼恢復---------群友葫蘆娃小米麵試題

activity 會因為記憶體不足意外中止,那麼activity裡面的fragment怎麼恢復呢?

在activity 的onSaveInstanceState() 方法中 通過FragmentManager 呼叫putFragment   ,儲存fragment的狀態 關於解答譯文:http://blog.csdn.net/a940659387/article/details/50730076

9. 2.26群友葫蘆娃群內提問

1.使用viewholder的時候,自己定義的class viewHolder需要static嗎,為什麼?

最好是靜態的,非靜態內部類要有外部類的物件才能被引用,需要例項化。靜態內部類就不同了,不用外部類的額例項就能拿到。為了保證物件唯一節約資源。 打個比方:就和Activity中的handler一樣,最好定義為靜態的,這樣即使handler沒有執行完,Activity還是能被正常回收,不會導致記憶體洩露。 接憧而至第二個問題 2.為什麼handler會導致記憶體洩露? 同一個執行緒的handler用的looper都是同一個,一個執行緒只有一個looper,訊息中存在handler的引用,所以只要有runnable或者message,handler就無法被回收了。handler無法被回收,則引起當前使用handler的Activity無法被回收,因此即使執行了Activity的生命週期onDestroy,handler的引用還是存在的,時間長了,就出現了記憶體洩露。 總結:其實就是一個引用鏈,分別為:messagequeue message handler activity

以上內容由博主純手工記錄和部分問題整理。轉載請註明出處:http://blog.csdn.net/qq_33078541?viewmode=contents

如你也是一個技術迷戀著,請加入我們的青春隊伍~wing_Android 技術交流群(425983695)