妥妥的去面試之Android基礎(三)

樹獺非懶發表於2019-02-15

筆者由於在近期需要找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想得到的機會才可能有機會入你懷中。

筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下

Android面試大綱.png

妥妥的去面試之Android基礎(一)

妥妥的去面試之Android基礎(二)

接下來開始本篇部落格的正菜:

1.Android中怎麼加速啟動Activity?

1.耗時操作的優化

在onCreate方法裡做耗時的話會很容易引發卡頓甚至ANR,所以耗時操作放在子執行緒中完成,使用多執行緒可以減少onCreate和onResume的時間,讓使用者儘快看到頁面。

2.佈局檔案優化

  • 去掉多餘的控制元件,用不到的控制元件和層級會浪費介面的渲染時間。
  • 使用include和merge,include減少檢視重用,merge減少檢視層級。
  • 使用ViewStub,ViewStub可以延遲載入無用的檢視。

3.檢視載入優化

最常見的就是我們Fragment的懶載入,只有當它顯示的時候才會去載入。

為什麼ViewStub可以提高載入效能?

ViewStub使用的是惰性載入的方式,即使將其放置於佈局檔案中,如果沒有進行載入那就為空,不像其它控制元件一樣只要佈局檔案中宣告就會存在。

那ViewStub適用於什麼場景呢?

通常用於網路請求頁面失敗的顯示。一般情況下若要實現一個網路請求失敗的頁面,我們是不是使用兩個View呢,一個隱藏,一個顯示。試想一下,如果網路狀況良好,並不需要載入失敗頁面,但是此頁面確確實實已經載入完了,無非只是隱藏看不見而已。如果使用ViewStub,在需要的時候才進行載入,就達到節約記憶體提高效能的目的了。

2.使用執行緒池有什麼好處?

  1. 重用執行緒池中的執行緒,避免了執行緒的建立和銷燬帶來的效能開銷。
  2. 能夠控制執行緒池中執行緒的併發數,避免大量的執行緒之間因互相搶佔系統資源導致的阻塞現象。
  3. 能夠對執行緒進行簡單的管理,可以提供定時執行以及指定間隔迴圈執行等功能。

ThradPoolExecutor執行緒池的執行任務的過程遵循什麼樣的規則?

  1. 如果所需執行緒數量沒有達到核心執行緒的數量,那麼就開啟一個核心執行緒執行任務。
  2. 如果所需執行緒的數量達到核心執行緒池的數量,那麼任務就會被插入到任務佇列中等待執行。
  3. 如果任務佇列已滿,無法再將任務新增到任務佇列中,就會立刻啟動一個非核心執行緒。
  4. 如果執行緒數量達到執行緒池的所能容納的最大值,就會啟動拒絕策略拒絕此任務,並通知呼叫者。

知道哪幾種常用的執行緒池?

  • FixThreadPool 只有核心執行緒,並且數量固定的,也不會被回收,所有執行緒都活動時,因為佇列沒有限制大小,新任務會等待執行。優點:更快的響應外界請求。
  • SingleThreadPool 只有一個核心執行緒,確保所有的任務都在同一執行緒中按序完成。因此不需要處理執行緒同步的問題。
  • CachedThreadPool 只有非核心執行緒,最大執行緒數非常大,所有執行緒都活動時會為新任務建立新執行緒,否則會利用空閒執行緒(60s空閒時間,過了就會被回收,所以執行緒池中有0個執行緒的可能)處理任務。 優點:任何任務都會被立即執行(任務佇列SynchronousQuue相當於一個空集合);比較適合執行大量的耗時較少的務。
  • ScheduledThreadPool 核心執行緒數固定,非核心執行緒(閒著沒活幹會被立即回收數量沒有限制。 優點:執行定時任務以及有固定週期的重複任務

建議與Android開發藝術探索 P406 同時食用

3.說說Listview的複用機制

ListView的複用機制是ListView為了提高效率內部實現的一種優化,這種優化是通過複用itemview的方式實現的。

它是怎麼提高效率的呢?

對於一個Listview來說,往往有很多的itemview,如果每次在獲取itemview的時候都通過重新建立的方式去獲取勢必會影響效率,尤其是在使用者頻繁滑動的情況下。通過複用之前建立過的itemView就可以避免重複建立,從而提升效率。

遇到過ListView非同步載入圖片亂序的問題嗎?它的原因是什麼?最後是怎麼解決的?

遇到過。把獲取到的圖片放於itemview中,然後不斷的滑動listview時,由於listview的複用機制,它會把之前的view複用到滑動到的新的view上,這就會造成圖片錯位,同時它還在非同步獲取新的圖片,這就會造成滑動時itemview上圖片的變換。

解決方法是使用findViewWithTag,由於ListView中的ImageView控制元件都是重用的,移出螢幕的控制元件很快會被進入螢幕的圖片重新利用起來,那麼getView()方法就會再次得到執行,而在getView()方法中會為這個ImageView控制元件設定新的Tag,這樣老的Tag就會被覆蓋掉,於是這時再呼叫findVIewWithTag()方法並傳入老的Tag,就只能得到null了,而我們判斷只有ImageView不等於null的時候才會設定圖片,這樣圖片亂序的問題也就不存在了。

建議與下列部落格共同食用

ListView複用和優化詳解

Android ListView非同步載入圖片亂序問題,原因分析及解決方案

4.如何實現Fragment的滑動?

Fragment實現滑動可以藉助ViewPager。

瞭解ViewPager+Fragment的懶載入嗎?

ViewPager為了讓滑動的時候防止出現卡頓現象,它的內部有一個快取機制,預設情況下,ViewPager會提前建立好當前Fragment旁的兩個Fragment。但是如果載入的資料比較耗時或者佔用記憶體較大,就需要考慮是否實現懶載入來載入fragment。也就是說當我開啟某個Fragment時才會去載入它。

建議與下列部落格共同食用 Fragment懶載入和ViewPager的坑

5.Asset目錄與res目錄的區別

assets:不會在 R檔案中生成相應標記,存放到這裡的資源在打包時會打包到程式安裝包中。(通過 AssetManager 類訪問這些檔案)

res:會在R檔案中生成 id標記,資源在打包時如果使用到則打包到安裝包中,未用到不會打入安裝包中。

相關文章