文章目錄
其實毫不誇張的說,現在安卓面試80%的題目都是面的任玉剛大佬《Android藝術開發探索》中的內容,我最近也在狂補書中的內容,這裏做一個標題黨,總結書中的本人覺得重要的知識點和要點,以便記憶。後續還會總結幾篇,如果有時間的話。
大佬的書真的非常有價值,我如獲至寶,許多知識點都是平常見到了,沒去細想。所以有一句話不知道當講不當講:過去的經歷如果不去總結,就只能叫經過!
共勉!
線程和線程池
線程和進程的區別?
- 一個程序至少有一個進程,一個進程至少有一個線程
進程是資源分配的最小單位,進程是程序執行過程的最小單位,(有了協程後,這個描述就不準確了)
線程是程序執行的最小單位(協程替代),包含了自己的工作內存,狀態信息。
進程和線程的區別
多線程同步的方法有哪幾種?
利用wait(), notify(), notifyAll(),或者wait(), join()方法實現線程同步
安卓異步的實現有哪些方式?
- AsyncTask
- 實現原理,多個異步任務是串行執行還是並行執行的?
- HandlerThread
- 主要用在哪些地方,實現原理是是什麼
- IntentService
- 單個Thread
- 線程池
線程池有哪幾種?有哪些區別?
- newFixedThreadPool
- 包含了固定數量的線程,線程沒有佔用時,不會回收。
- newCacheThreadPool
- 線程數量不定的線程池,只有非核心線程,可以根據資源最大值來設置,並且有超時限制。
- newSingleThreadPool
- 單個串行的核心線程,每個任務執行,是按順序執行
- newScheduledThreadPool
- 包含核心線程和非核心線程,非核心線程不執行時,會被回收,可定時,週期性的執行的線程池
Bitmap緩存
Bitmap像素ARGB值的計算
- 理解色域的概念,不同色域計算方式不同
- 計算hsv 數組
- 調用
Color.HSVToColor(hsv)
private int getColorAtPoint(float eventX, float eventY) {
float x = eventX - centerX;
float y = eventY - centerY;
double r = Math.sqrt(x * x + y * y);
float[] hsv = {0, 0, 1};
hsv[0] = (float) (Math.atan2(y, -x) / Math.PI * 180f) + 180;
hsv[1] = Math.max(0f, Math.min(1f, (float) (r / radius)));
return Color.HSVToColor(hsv);
}
文件圖像的大小計算
- 文件,資源,網絡加載的圖片,加載到手機內存中,佔用大小一般不同,假如一個
1024*1024
的圖片,以ARGB_8888格式的像素點爲例,一般佔用就是1024*1024*4=4M
,如果是res/drawable-xdpi目錄,大小還不一樣。
圖片文件的兩次讀取
- BitmapFactory讀文件有四個方法:
decodeResource()
decodeStream()
decodeFile()
decodeByByteArray()
- 使用
BitmapFactory.Options.inSampleSize
可以縮放圖片大小。 BitmapFactory.Options.inSampleSize
一般是2的倍數,圖片的寬和高變成1/inSampleSize
- 讀取圖片時,採用兩步讀取:
先獲取圖片原始的寬和高信息
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFActory.decodeResource(res, resId, options);
上面會得到圖片原始大小
圖片文件的採樣率優化
圖片採樣率大小根據原始圖片寬高,和展示的目標寬高做一個縮放,計算縮放比:
options.inSampleSize = caculateInSampleSize(options, desWidth, desHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResouces(res, resId, options);
然後再解析圖片,就得到接近目標寬高的圖片大小。
性能優化
性能優化包含許多優化內容,包括:
- 佈局優化
- 繪製優化
- List優化
- 響應速度優化
- 緩存優化
- Bitmap優化
- 線程優化
- 編碼優化
佈局優化
佈局優化,主要目的是爲了減少視圖的層級,進而減少不必要的事件分發,測繪,佈局,繪製方法。可以從這幾方面着手:
- 使用
<include>
標籤,配合<merge>
標籤,減少佈局層次 - 使用
<ViewStub/>
組件來隱藏一開始不用展示的組件。 - 使用
LinearLayout
有限的替換RelativeLayout
繪製優化
- 主要在
onDraw()
方法中,儘量少的執行耗時方法。
list列表優化
- 自定義ViewHolder複用佈局。
響應速度優化
- 避免在主線程中做過多的耗時操作
- 出現ANR,去看trace文件找問題
內存泄露優化
- 單例引用對象,沒有釋放。
- 靜態變量導致Activity沒法銷燬等
- 無限循環屬性動畫沒有被停止
- 編碼規範
- 使用MAT工具,AS 自帶的Profile工具檢測。
緩存優化
- 三級緩存優化-網絡,
LruCache + DiskLruCache
- 數據庫持久化
Bitmap優化
上文中,Bitmap緩存,有講到, 結合緩存優化,效果更佳。
線程優化
- 採用線程池,避免過多的創建線程,雖然線程池可以重用,但大量創建和銷燬線程會造成許多損耗。