Android面試大全(性能優(yōu)化篇)

Android面試大全(四大組件篇)
Android面試大全(性能優(yōu)化篇)
Android面試大全(異常處理篇)
Android面試大全(開源框架篇)
Android面試大全(網(wǎng)絡(luò)篇)
Android面試大全(java篇)


前言

android中的性能優(yōu)化這一方面不止是一道面試題,也是項(xiàng)目中必須要做的一件事情,只有做好的性能方面的優(yōu)化,用戶體驗(yàn)滿意度才會(huì)有所提升

分類

啟動(dòng)黑白屏問題

  • 安裝app后,啟動(dòng)時(shí)會(huì)有短暫的白屏,這大大影響整體的美觀,姑且在這里也給算在性能優(yōu)化這一塊
    • 出現(xiàn)白屏原因
      系統(tǒng)加載布局文件是需要時(shí)間的,在剛啟動(dòng)時(shí)布局文件還沒加載完畢(即setContentView(int)之前)顯示的是window背景,出現(xiàn)的白屏(或黑屏)是window的背景色
    • 解決辦法
    • 替換window的背景(可為圖片或純色)
      只需在啟動(dòng)activity界面根標(biāo)簽下設(shè)置android:theme="@style/MyTheme"屬性
      自定義一個(gè)style
  <style name="Mytheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@mipmap/ic_launcher</item>//設(shè)置圖片
        <item name="ndroid:windowBackground">@color/fireBar</item>//設(shè)置純色
        <item name="android:windowNoTitle">true</item>//去title
    </style>
  • 注意事項(xiàng)
    • 設(shè)置屬性只能設(shè)置在啟動(dòng)頁(yè),不能設(shè)置在application標(biāo)簽下,此標(biāo)簽代表全局
    • 設(shè)置圖片最好是.9.png類型圖片(此種圖可適配機(jī)型),若使用.png圖片需考慮不同機(jī)型適配問題(切多種分表率的圖)

布局優(yōu)化

  • 減少嵌套的層級(jí)(可使用RelativeLayout),減少嵌套層級(jí)可加快加載效率,
  • 使用style提取相同view的公共屬性,減少重復(fù)代碼
  • 使用include標(biāo)簽
  • 合理使用ViewStub

圖片的優(yōu)化

android中圖片的使用是非常占用內(nèi)存資源的。

  • ①:在圖片未使用時(shí),及時(shí)recycle()回收
  • ②:使用三級(jí)緩存,內(nèi)存-sd卡-網(wǎng)絡(luò)
    內(nèi)存中再次獲取最快,由于內(nèi)存有限可能被gc回收,sd卡中的圖片不會(huì)回收,當(dāng)前面兩種都不存在所需圖片時(shí),才去網(wǎng)洛下載
  • ③:將大圖片進(jìn)行壓縮處理再放到內(nèi)存中,用到BitmapFactory
/**創(chuàng)建縮略圖方法
*filepath 圖片路徑
 i  壓縮比例,最終為原圖的1/(i^2)
*/
 private Bitmap onCreateThumbnail(String filePath, int i) {
         BitmapFactory.Options options=new BitmapFactory.Options();
        //設(shè)置為不讀內(nèi)容,值讀取邊界值
          options.inJustDecodeBounds=true;
         //通過編輯,得到邊界值,并存入到option中
         BitmapFactory.decodeFile(filePath,options);
        //賦值縮放比例
         options.inSampleSize=i;
         //設(shè)置顯示的圖片格式
         options.inPreferredConfig=Config.RGB_565;
         //設(shè)置為讀取內(nèi)容,
         options.inJustDecodeBounds=false;
        //得到縮略圖
         return BitmapFactory.decodeFile(filePath2, options);
     }
  • ④:盡量不在Button上使用selector來(lái)設(shè)置點(diǎn)擊與正常時(shí)背景圖,因?yàn)樵赽utton初始化時(shí)會(huì)將選中狀態(tài)與正常狀態(tài)的兩張圖都加載都內(nèi)存中,無(wú)疑在無(wú)意中加大了內(nèi)存的占用,可xml中設(shè)置正常的背景,在setOnTouchListener監(jiān)聽中通過代碼動(dòng)態(tài)改變,在按下時(shí)顯示選中狀態(tài)北京,抬起恢復(fù)
final Button button=new Button(this);
        button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        //手指按下
                        button.setBackgroundResource(R.mipmap.down);
                        break;
                    case MotionEvent.ACTION_UP:
                        //手指抬起,恢復(fù)
                        button.setBackgroundResource(R.mipmap.up);
                        break;
                }
                //為了監(jiān)聽事件的分發(fā),返回false
                return false;
            }
        });
  • 圖片解碼率也會(huì)影響圖片所占內(nèi)存
    常見的png,JPG,webp等格式的圖片在設(shè)置到UI上之前需要經(jīng)過解碼過程,而圖片采用不同的碼率,也會(huì)造成對(duì)內(nèi)存的占用不同。
    • ARGB_4444 格式的解碼率,這種格式的圖片,看起來(lái)質(zhì)量太差,已經(jīng)不推薦使用。 而強(qiáng)烈推薦使用ARGB_8888來(lái)代替。一個(gè)像素占用2個(gè)字節(jié),alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4個(gè)bites 。 共16bytes,即2個(gè)字節(jié)
  • ARGB_8888 格式的解碼率,一個(gè)像素占用4個(gè)字節(jié),alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8個(gè)bytes , 共32bytes , 即4個(gè)字節(jié)。這是一種高質(zhì)量的圖片格式,電腦上普通采用的格式。它也是Android手機(jī)上一個(gè)BitMap的默認(rèn)格式。
  • RGB_565格式的解碼率,一個(gè)像素占用2個(gè)字節(jié),沒有alpha(A)值,即不支持透明和半透明, Red(R)值占5個(gè)bytes ,Green(G)值占6個(gè)bytes ,Blue(B)值占5個(gè)bytes,共16bytes,即2個(gè)字節(jié)。 對(duì)于半透明顏色的圖片來(lái)說,該格式的圖片能夠達(dá)到比較好的呈現(xiàn)效果,相對(duì)于ARGB_8888來(lái)說也能減少一半的內(nèi)存開銷,因此它是一個(gè)不錯(cuò)的選擇。推薦使用

大量數(shù)據(jù)優(yōu)化

  • 分頁(yè)加載
  • 緩存方式

列表項(xiàng)優(yōu)化

  • listview的優(yōu)化
    • convertview的復(fù)用(View的復(fù)用)
    • viewholder類的使用,減少查找控件的次數(shù)(findviewbyid()次數(shù)),將holder與view綁定來(lái)實(shí)現(xiàn)(.setTag()、.getTag()
    • 數(shù)據(jù)分頁(yè)加載
  • RecycleView的優(yōu)化

其他優(yōu)化

  • 網(wǎng)絡(luò)優(yōu)化
    • 同一個(gè)頁(yè)面數(shù)據(jù)盡量放到一個(gè)接口中去處理
  • 使用Application Context代替Activity Context
  • 謹(jǐn)慎使用static 關(guān)鍵字
    • static使用不當(dāng)容易造成內(nèi)存泄漏
  • 數(shù)據(jù)庫(kù)優(yōu)化
  • 電量?jī)?yōu)化
  • 多線程并發(fā)引發(fā)的性能等

正在持續(xù)跟新中……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容