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

筆者因爲在近期須要找工做,因此近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想獲得的機會纔可能有機會入你懷中。html

筆者會將準備面試的學習過程記錄下來,方便本身覆盤的同時也但願能給一道找工做的小夥伴們一些幫助。筆者準備的內容大綱以下面試

Android面試大綱.png

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

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

接下來開始本篇博客的正菜:多線程

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

1.耗時操做的優化併發

在onCreate方法裏作耗時的話會很容易引起卡頓甚至ANR,因此耗時操做放在子線程中完成,使用多線程能夠減小onCreate和onResume的時間,讓用戶儘快看到頁面。異步

2.佈局文件優化佈局

  • 去掉多餘的控件,用不到的控件和層級會浪費界面的渲染時間。
  • 使用include和merge,include減小視圖重用,merge減小視圖層級。
  • 使用ViewStub,ViewStub能夠延遲加載無用的視圖。

3.視圖加載優化post

最多見的就是咱們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標記,資源在打包時若是使用到則打包到安裝包中,未用到不會打入安裝包中。

相關文章
相關標籤/搜索