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

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

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

Android面試大綱.png

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

接下來開始本篇博客的正菜網絡

1.AsyncTask的缺陷?使用時有什麼須要注意的點?

(1)經過AsyncTask能夠更加方便的執行後臺任務以及在主線程中訪問ui,可是並不合適執行特別耗時的後臺任務。併發

這個主要是由於在Android 3.0以後它的內部是串行執行任務的。串行執行任務效率就會比較低,雖然能夠經過調用AsyncTask的executeOnExecutor方法並行執行任務,可是在併發程度比較高的狀況下,很容易帶來併發錯誤,這也是Android 3.0以後將並行改爲串行的主要緣由。框架

(2)注意AsyncTask的內存泄露、生命週期問題異步

  • 內存泄漏

若是AsyncTask被聲明爲Activity的非靜態的內部類,那麼AsyncTask會保留一個對Activity的引用。若是Activity已經被銷燬,AsyncTask的後臺線程還在執行,它將續在內存裏保留這個引用,致使Activity沒法被內存回收,引發內存泄漏。函數

解決方法:oop

(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格式數據的方法

相關文章
相關標籤/搜索