筆者由於在找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想要的機會才有機會入你懷中。
筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下
接下來開始本篇部落格的正菜
1.AsyncTask的缺陷?使用時有什麼需要注意的點?
(1)通過AsyncTask可以更加方便的執行後臺任務以及在主執行緒中訪問ui,但是並不合適執行特別耗時的後臺任務。
這個主要是因為在Android 3.0之後它的內部是序列執行任務的。序列執行任務效率就會比較低,雖然可以通過呼叫AsyncTask的executeOnExecutor方法並行執行任務,但是在併發程度比較高的情況下,很容易帶來併發錯誤,這也是Android 3.0之後將並行改成序列的主要原因。
(2)注意AsyncTask的記憶體洩露、生命週期問題
- 記憶體洩漏
如果AsyncTask被宣告為Activity的非靜態的內部類,那麼AsyncTask會保留一個對Activity的引用。如果Activity已經被銷燬,AsyncTask的後臺執行緒還在執行,它將續在記憶體裡保留這個引用,導致Activity無法被記憶體回收,引起記憶體洩漏。
解決方法:
(1)將AsyncTask改為靜態內部類,也可以在內部類AsyncTask裡面持有Activity的弱引用。
(2)在Activity的onDestroy生命週期方法裡呼叫AsyncTask的cancel銷燬AsyncTask
- 生命週期
在Activity中建立的AsyncTask會一直執行,直到doInBackground()方法執行完畢,所以我們在銷燬Activity的時候也需要銷燬AsyncTask。通過在Activity的onDestroy生命週期方法裡呼叫AsyncTask的cancel銷燬AsyncTask
建議配合Android開發藝術探索(P392) 同時食用
2.談談Android的訊息機制?
Android的訊息機制主要指Handler的執行機制以及Handler所附帶的MessageQueue和Looper的工作過程,這三者實際上是一個整體。Handler的主要作用是將一個任務切換到某個指定的執行緒中去執行。
那Handler是怎麼工作的呢?
Handler主要包含訊息的傳送和接收。某執行緒藉助Handler傳送一條訊息,就會插入到MessageQueue這個訊息佇列中,Looper不斷的輪詢這個訊息佇列,如果輪詢到新的訊息到來就會去取出並處理它,再交由Handler的dispatchMessage方法處理訊息,dispatchMessage方法是在Handler所在的執行緒,所以於此同時,執行緒也就切換到了Handler所在的執行緒了。
MessageQueue的內部實現是一個佇列嗎?
不是,它用一個單連結串列來維護訊息列表,因為MessageQueue需要不斷的插入和刪除資料,而單連結串列實現插入和刪除的效率高。
建議配合該部落格同時食用 聊聊Android的訊息機制
3.Thread、AsyncTask、IntentService的使用場景與特點?
- Thread是一個普通的執行緒,獨立於Activity的。當Activity 被 finish 後,如果沒有主動停止 Thread或者 run 方法沒有執行完,就會一直執行下去。
- AsyncTask是 封裝了兩個執行緒池和一個Handler,(SerialExecutor用於排隊,THREAD_POOL_EXECUTOR為真正的執行任務,Handler用於將工作執行緒切換到主執行緒)。它適合網路請求或者簡單資料處理。但不適合處理特別耗時的後臺任務。
- IntentService本質上是封裝了HandlerThread和Handler的非同步框架。當任務會執行完成後,它會自動停止,因為它是一個服務,所以它的優先順序比執行緒高很多,不容易被殺死,所以適合執行一些高優先順序的耗時的後臺任務。
HandlerThread就是可以使用Handler的Thread,它是一個序列佇列,有自己的內部Looper物件,背後只有一個執行緒。
4.Serializable和Parcelable的比較
它們都是用於物件序列化的介面,有的時候我們需要把物件持久化到儲存裝置或者通過網路進行傳輸給其他客戶端,這個時候就需要完成物件的持久化。通過這兩個介面我們可以序列化來完成物件的持久化。
- Serializable(Java自帶)
Serializable是序列化的意思,表示將一個物件轉換成儲存或可傳輸的狀態。序列化後的物件可以在網路上進傳輸,也可以儲存到本地。
- Parcelable(android專用)
使用Parcelable也可以實現物件序列化果,不過不同於Serializable,Parcelable方式的實現原理是將一個完整的物件進行分解,而分解後的每一部分都是Intent所支援的資料型別,這也就實現傳遞物件的功能。
總結
Serializable需要大量的I/O操作,雖然使用時操作方便但是開銷很大。Parcelable使用起來稍微麻煩點,但它的效率高,它是Android推薦的序列化方式,首選Parcelable。
建議配合Android開發藝術探索(P47) 同時食用
5.Android中有哪幾種解析xml的方式,官方推薦哪種?它們的原理和區別?
有DOM、SAX、PULL三種解析方式
- DOM是基於文件驅動的方式。可用於直接訪問 XML 文件的各個部分。 它是一次性全部將內容載入在記憶體中,生成一個樹狀結構,它沒有涉及回撥和複雜的狀態管理。缺點是載入大文件時效率低下。
- SAX使用流式處理的方式。是以事件為驅動的XML API,使用回撥函式來實現。優點是解析速度快,佔用記憶體少。缺點是不能倒退。
- PULL內建於 Android 系統中。也是官方解析佈局檔案所使用的方式。 Pull 與 SAX 有點類似,都提供了類似的事件,如開始元素和結束元素。不同的是Pull解析器並沒有強制要求提供觸發的方法。因為他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。
建議配合該部落格同時食用 Android中解析XML格式資料的方法