筆者由於在近期需要找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想得到的機會才可能有機會入你懷中。
筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下
接下來開始本篇部落格的正菜:
1.Android中怎麼加速啟動Activity?
1.耗時操作的優化
在onCreate方法裡做耗時的話會很容易引發卡頓甚至ANR,所以耗時操作放在子執行緒中完成,使用多執行緒可以減少onCreate和onResume的時間,讓使用者儘快看到頁面。
2.佈局檔案優化
- 去掉多餘的控制元件,用不到的控制元件和層級會浪費介面的渲染時間。
- 使用include和merge,include減少檢視重用,merge減少檢視層級。
- 使用ViewStub,ViewStub可以延遲載入無用的檢視。
3.檢視載入優化
最常見的就是我們Fragment的懶載入,只有當它顯示的時候才會去載入。
為什麼ViewStub可以提高載入效能?
ViewStub使用的是惰性載入的方式,即使將其放置於佈局檔案中,如果沒有進行載入那就為空,不像其它控制元件一樣只要佈局檔案中宣告就會存在。
那ViewStub適用於什麼場景呢?
通常用於網路請求頁面失敗的顯示。一般情況下若要實現一個網路請求失敗的頁面,我們是不是使用兩個View呢,一個隱藏,一個顯示。試想一下,如果網路狀況良好,並不需要載入失敗頁面,但是此頁面確確實實已經載入完了,無非只是隱藏看不見而已。如果使用ViewStub,在需要的時候才進行載入,就達到節約記憶體提高效能的目的了。
2.使用執行緒池有什麼好處?
- 重用執行緒池中的執行緒,避免了執行緒的建立和銷燬帶來的效能開銷。
- 能夠控制執行緒池中執行緒的併發數,避免大量的執行緒之間因互相搶佔系統資源導致的阻塞現象。
- 能夠對執行緒進行簡單的管理,可以提供定時執行以及指定間隔迴圈執行等功能。
ThradPoolExecutor執行緒池的執行任務的過程遵循什麼樣的規則?
- 如果所需執行緒數量沒有達到核心執行緒的數量,那麼就開啟一個核心執行緒執行任務。
- 如果所需執行緒的數量達到核心執行緒池的數量,那麼任務就會被插入到任務佇列中等待執行。
- 如果任務佇列已滿,無法再將任務新增到任務佇列中,就會立刻啟動一個非核心執行緒。
- 如果執行緒數量達到執行緒池的所能容納的最大值,就會啟動拒絕策略拒絕此任務,並通知呼叫者。
知道哪幾種常用的執行緒池?
- 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的時候才會設定圖片,這樣圖片亂序的問題也就不存在了。
建議與下列部落格共同食用
4.如何實現Fragment的滑動?
Fragment實現滑動可以藉助ViewPager。
瞭解ViewPager+Fragment的懶載入嗎?
ViewPager為了讓滑動的時候防止出現卡頓現象,它的內部有一個快取機制,預設情況下,ViewPager會提前建立好當前Fragment旁的兩個Fragment。但是如果載入的資料比較耗時或者佔用記憶體較大,就需要考慮是否實現懶載入來載入fragment。也就是說當我開啟某個Fragment時才會去載入它。
建議與下列部落格共同食用 Fragment懶載入和ViewPager的坑
5.Asset目錄與res目錄的區別
assets:不會在 R檔案中生成相應標記,存放到這裡的資源在打包時會打包到程式安裝包中。(通過 AssetManager 類訪問這些檔案)
res:會在R檔案中生成 id標記,資源在打包時如果使用到則打包到安裝包中,未用到不會打入安裝包中。