面試經歷:記一次Android面試

Android中的內存泄漏和內存溢出有什麼區別?

內存溢出是指程序在申請內存的時候,沒有足夠的內存能夠分配,致使Out Of Memory錯誤,也就是OOM。java

內存泄漏:對象都有生命週期的,在生命週期完成以後,就該被垃圾回收和釋放,若是得不到及時的釋放,就會一直佔用內存,形成內存泄漏。隨着內存泄漏的堆積,可用的內存空間愈來愈少,最後會致使內存溢出。android

致使內存泄漏有不少緣由,最多見的有內部類的使用,由於內部類持有外部引用。還有就是對Activity Context的使用,若是沒有特別的要求,儘可能使用Application context. 避免其餘地方持有Activity而得不到釋放,若是必需要用Activity Context,能夠用弱引用。緩存

Android中的顯式Intent 和 隱式Intent 有什麼區別?

顯式Intent: 即直接指定須要打開的Activity類,能夠惟一肯定一個Activity,意圖特別明確,因此是顯式的。設置這個類的方式能夠是Class對象(如SecondActivity.class),也能夠是包名加類名的字符串。應用程序內部Activity跳轉經常使用這個方式。服務器

隱式Intent: 隱式不明確指定啓動哪一個Activity,而是設置Action、Data、Category,讓系統來篩選出合適的Activity。篩選是根據全部的來篩選。網絡

Activity有幾種啓動模式?有什麼區別?

Activity啓動有4種模式,區別以下:架構

standard:Activity的每一次啓動都會新建一個Activity實例,並將其壓入任務棧的棧頂,而無論這個Activity是否存在,而且會走生命週期框架

singleTop:棧頂複用模式,這種模式下,若是Activity已經位於任務棧的棧頂,那麼此Activity不會被從新建立,因此他的啓動三回調就不會執行,同時Activity的onNewIntent 方法會被回調,若是Activity已經存在可是不在棧頂,那麼它的做用和standard同樣。異步

singleTask:系統建立新任務並實例化位於新任務底部的 Activity。可是,若是該 Activity 的一個實例已存在於一個單獨的任務中,則系統會經過調用現有實例的 onNewIntent() 方法向其傳送 Intent,而不是建立新實例。一次只能存在 Activity 的一個實例。ide

singleInstance:單首創建一個新的任務棧。性能

在Activity中如何保存/恢復狀態?

分別調用onSaveInstanceState和onRestoreInstanceState 2個方法保存和恢復狀態。

有使用過AsyncTask嗎?

不多使用AsyncTask了,異步基本用RxJava 來作。

Android 中序列化有哪些方式?區別?

Serializable(Java自帶): Serializable是序列化的意思,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化後的對象能夠在網絡上進行傳輸,也能夠存儲到本地。

Parcelable(android 專用): 除了Serializable以外,使用Parcelable也能夠實現相同的效果,不過不一樣於將對象進行序列化,Parcelable方式的實現原理是將一個完整的對象進行分解,而分解後的每一部分都是Intent所支持的數據類型,這樣也就實現傳遞對象的功能了。

區別:Parcelable比Serializable性能高,因此應用內傳遞數據推薦使用Parcelable,可是Parcelable不能使用在要將數據存儲在磁盤上的狀況,由於Parcelable不能很好的保證數據的持續性在外界有變化的狀況下。儘管Serializable效率低點,但此時仍是建議使用Serializable 。 詳細介紹請看文章:序列化Serializable和Parcelable的理解和區別

用過哪些圖片加載框架?看過源碼嗎?簡述一下流程。

Universal-Image-Loader,Picasso,Glide。這個能夠自由發揮,根據本身的實際狀況講解,若是本身有看過源碼之類的,儘可能多講。

RxJava 中 flatMap 和 concatMap 有什麼區別?

concatMap和flatMap的功能是同樣的, 將一個發射數據的Observable變換爲多個Observables,而後將它們發射的數據放進一個單獨的Observable。只不過最後合併Observables flatMap採用的merge,而concatMap採用的是鏈接(concat)。總之一句一話,他們的區別在於:concatMap是有序的,flatMap是無序的,concatMap最終輸出的順序與原序列保持一致,而flatMap則不必定,有可能出現交錯。

MVP 架構的優缺點?

MVP優勢:

  • Model與View徹底分離,完全解耦
  • Presenter複用,能夠將一個Presenter用於多個視圖,而不用改變Presenter的邏輯
  • 能夠實現View接口進行邏輯測試(Presenter的單元測試)

MVP的缺點及優化:

  • View層過大,Activity複雜,加入模板方法,分離出BaseActivity用於處理公共邏輯
  • Model層過大,作好模塊劃分,進行接口隔離,在內部進行分層。
  • 還有一個問題是,MVP額外的增長了不少類和接口,這個能夠根據項目實際狀況進行相應地優化

OkHttp 的addInterceptor 和 addNetworkInterceptor 的區別?

addInterceptor(應用攔截器):

  • 不須要擔憂中間過程的響應,如重定向和重試.
  • 老是隻調用一次,即便HTTP響應是從緩存中獲取.
  • 觀察應用程序的初衷. 不關心OkHttp注入的頭信息如: If-None-Match.
  • 容許短路而不調用 Chain.proceed(),即停止調用.
  • 容許重試,使 Chain.proceed()調用屢次.

addNetworkInterceptor(網絡攔截器):

  • 可以操做中間過程的響應,如重定向和重試.
  • 當網絡短路而返回緩存響應時不被調用.
  • 只觀察在網絡上傳輸的數據.
  • 攜帶請求來訪問鏈接.

如何獲取程序的崩潰日誌?

java層crash log收集:

經過實現系統的UncaughtExceptionHandler類,並重寫uncaughtException方法,在uncaughtException方法中會獲取到錯誤的日誌,能夠將日誌保存到本地,在適當的時機上傳至服務器,這樣開發人員就能夠獲取日誌,分析崩潰緣由。而且還能夠自定義提示信息,給出用戶友好的提示。

相關文章
相關標籤/搜索