9102年末將至,BAT高級開發21道彙總:Bitmap+Handler+性能優化篇

前言

面試:若是不許備充分的面試,徹底是浪費時間,更是對本身的不負責java

今天給你們分享下我整理的BAT架構面試專題及答案,其中大部分都是大企業面試常問的面試題,能夠對照這查漏補缺,固然了,這裏所列的確定不可能覆蓋所有方式,不過也但願能對即將找工做的朋友起到一些幫助!在這因爲文字不少,我總結了Android面試所涉及到的常問範圍及架構面試專題和答案解析和架構視頻資料分享給你們

更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
能夠點擊關於我聯繫我獲取完整PDF或者互相交流
( VX:mm14525201314)

今天先來分析一下Bitmap+Handler+性能優化git

一.Bitmap

一、Bitmap 使用須要注意哪些問題 ?

參考回答:

1)要選擇合適的圖片規格(bitmap 類型): 一般咱們優化Bitmap 時,當須要作性能優化或者防止 OOM,咱們一般會使用 RGB_565,由於 ALPHA_8 只有透明度,顯示通常圖片沒有意義,Bitmap.Config.ARGB_4444 顯示圖片不清楚,Bitmap.Config.ARGB_8888 佔用內存最多。:程序員

  • ALPHA_8 每一個像素佔用 1byte 內存
  • ARGB_4444 每一個像素佔用 2byte 內存
  • ARGB_8888 每一個像素佔用 4byte 內存(默認)
  • RGB_565 每一個像素佔用 2byte 內存

2)下降採樣率: BitmapFactory.Options 參數 inSampleSize 的使用,先把 options.inJustDecodeBounds 設爲 true,只是去讀取圖片的大小,在拿到圖片的大小以後和要顯示的大小作比較經過 calculateInSampleSize()函數計算 inSampleSize 的具體值,獲得值以後。options.inJustDecodeBounds 設爲 false讀圖片資源。github

3)複用內存: 即經過軟引用(內存不夠的時候纔會回收掉),複用內存塊,不須要再從新給這個 bitmap 申請一塊新的內存,避免了一次內存的分配和回收,從而改善了運行效率。面試

4)使用 recycle()方法及時回收內存。算法

5)壓縮圖片緩存

二、Bitmap.recycle()會當即回收麼?何時會回收?若是沒有地方使用這個 Bitmap,爲何垃圾回收不會直接回收?

參考回答:

經過源碼能夠了解到,加載 Bitmap 到內存裏之後,是包含兩部份內存區域的。簡單的說,一部分是 Java 部分的,一部分是 C部分的。這個 Bitmap 對象是由 Java 部分分配的,不用的時候系統就會自動回收了安全

可是那個對應的 C 可用的內存區域,虛擬機是不能直接回收的,這個只能調用底層的功能釋放。因此須要調用 recycle()方法來釋放 C 部分的內存性能優化

bitmap.recycle()方法用於回收該 Bitmap 所佔用的內存,接着將 bitmap 置空,最後使用 System.gc()調用一下系統的垃圾回收器進行回收,調用 System.gc()並不能保證當即開始進行回收過程,而只是爲了加快回收的到來架構

三、一張 Bitmap 所佔內存以及內存佔用的計算

參考回答:

Bitamp 所佔內存大小 = 寬度像素 x (inTargetDensity /inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一個像素所佔的內存字節大小

注: 這裏 inDensity 表示目標圖片的 dpi(放在哪一個資源文件夾下),inTargetDensity 表示目標屏幕的 dpi,因此你能夠發現 inDensityinTargetDensity 會對Bitmap 的寬高進行拉伸,進而改變 Bitmap 佔用內存的大小。

在 Bitmap 裏有兩個獲取內存佔用大小的方法。

  • getByteCount()API12 加入,表明存儲 Bitmap 的像素須要的最少內存。
  • getAllocationByteCount()API19 加入,表明在內存中爲 Bitmap 分配的內存大小,代替了getByteCount() 方法。
  • 在不復用 Bitmap 時,getByteCount()getAllocationByteCount 返回的結果是同樣的。在經過複用 Bitmap 來解碼圖片時,那麼 getByteCount()表示新解碼圖片佔用內存的大 小,getAllocationByteCount() 表示被複用 Bitmap 真實佔用的內存大小

四、Android 中緩存更新策略 ?

參考回答:

Android 的緩存更新策略沒有統一的標準,通常來講,緩存策略主要包含緩存的添加、獲取和刪除這三類操做,但不論是內存緩存仍是存儲設備緩存,它們的緩存容量是有限制的,所以刪除一些舊緩存並添加新緩存,如何定義緩存的新舊這就是一種策略,不一樣的策略就對應着不一樣的緩存算法

好比能夠簡單地根據文件的最後修改時間來定義緩存的新舊,當緩存滿時就將最後修改時間較早的緩存移除,這就是一種緩存算法,但不算很完美

五、LRU 的原理 ?

參考回答:

爲減小流量消耗,可採用緩存策略。經常使用的緩存算法是LRU(Least Recently Used):當緩存滿時, 會優先淘汰那些近期最少使用的緩存對象。主要是兩種方式:

  • LruCache(內存緩存):LruCache 類是一個線程安全的泛型類:內部採用一個 LinkedHashMap 以強引用的方式存儲外界的緩存對象,並提供 get 和 put 方法來完成緩存的獲取和添加操做,當緩存滿時會移除較早使用的緩存對象,再添加新的緩存對象。
  • DiskLruCache(磁盤緩存): 經過將緩存對象寫入文件系統從而實現緩存效果

二.Handler

6.談談消息機制 Handler 做用 ?有哪些要素 ?流程是怎樣的 ?

7.一個線程可否建立多個 Handler,Handler 跟 Looper 之間的對應關係 ?

8.軟引用跟弱引用的區別

9.Handler 引發的內存泄露緣由以及最佳解決方案

10.爲何系統不建議在子線程訪問 UI?

11.Looper 死循環爲何不會致使應用卡死?

12.使用 Handler 的 postDealy 後消息隊列會有什麼變化?

13.能夠在子線程直接 new 一個 Handler 嗎?怎麼作?

14.Message 能夠如何建立?哪一種效果更好,爲何?

三.性能優化

15.圖片的三級緩存中,圖片加載到內存中,若是內存快爆了,會發生什麼?怎麼處理?

16.內存中若是加載一張 500*500 的 png 高清圖片.應該是佔用多少的內存?

17.WebView 的性能優化 ?

18.Bitmap 如何處理大圖,如一張 30M 的大圖,如何預防 OOM?

19.內存回收機制與 GC 算法(各類算法的優缺點以及應用場景);GC 原理時機以及 GC 對象

20.內存泄露和內存溢出的區別 ?AS 有什麼工具能夠檢測內存泄露

21.性能優化,怎麼保證應用啓動不卡頓? 黑白屏怎麼處理?

最後

爲了避免影響閱讀,針對於上面的面試題我總結出了互聯網公司Android程序員面試涉及到的絕大部分面試題及答案解析及知識點參考作成了文檔(983頁PDF)和架構視頻資料免費分享給你們!(含有從 基礎到進階。含有BATJ.字節跳動面試專題,算法專題,高端技術專題,混合開發專題,java面試專題,Android,Java小知識,到性能優化.線程.View.OpenCV.NDK等應有盡有。還有輔之 相關的視頻+學習筆記

整理不易,但願你們在明年有個好的成功,分享是一種美德,以爲不錯的朋友能夠點贊後分享給更多的朋友!

請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
能夠點擊關於我聯繫我獲取完整PDF
(VX:mm14525201314)

相關文章
相關標籤/搜索