【android面試】2019年知識點總結(1)

其實毫不誇張的說,現在安卓面試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目錄,大小還不一樣。

RGB565與RGB_8888的區別

圖片文件的兩次讀取

  • 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緩存,有講到, 結合緩存優化,效果更佳。

線程優化

  • 採用線程池,避免過多的創建線程,雖然線程池可以重用,但大量創建和銷燬線程會造成許多損耗。

編碼優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章