Android面試大全(四大組件篇)
Android面試大全(性能優(yōu)化篇)
Android面試大全(異常處理篇)
Android面試大全(開源框架篇)
Android面試大全(網(wǎng)絡(luò)篇)
Android面試大全(java篇)
前言
android中的性能優(yōu)化這一方面不止是一道面試題狰闪,也是項(xiàng)目中必須要做的一件事情诱贿,只有做好的性能方面的優(yōu)化,用戶體驗(yàn)滿意度才會有所提升
分類
啟動黑白屏問題
- 安裝app后厚棵,啟動時(shí)會有短暫的白屏,這大大影響整體的美觀引颈,姑且在這里也給算在性能優(yōu)化這一塊
- 出現(xiàn)白屏原因
系統(tǒng)加載布局文件是需要時(shí)間的联四,在剛啟動時(shí)布局文件還沒加載完畢(即setContentView(int)
之前)顯示的是window背景,出現(xiàn)的白屏(或黑屏)是window的背景色 - 解決辦法
- 替換window的背景(可為圖片或純色)
只需在啟動activity界面根標(biāo)簽下設(shè)置android:theme="@style/MyTheme"
屬性
自定義一個(gè)style
- 出現(xiàn)白屏原因
<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è)置在啟動頁仑濒,不能設(shè)置在
application
標(biāo)簽下叹话,此標(biāo)簽代表全局 - 設(shè)置圖片最好是
.9.png
類型圖片(此種圖可適配機(jī)型),若使用.png
圖片需考慮不同機(jī)型適配問題(切多種分表率的圖)
- 設(shè)置屬性只能設(shè)置在啟動頁仑濒,不能設(shè)置在
布局優(yōu)化
- 減少嵌套的層級(可使用RelativeLayout),減少嵌套層級可加快加載效率墩瞳,
- 使用style提取相同view的公共屬性驼壶,減少重復(fù)代碼
- 使用include標(biāo)簽
- 合理使用ViewStub
圖片的優(yōu)化
android中圖片的使用是非常占用內(nèi)存資源的。
- ①:在圖片未使用時(shí)喉酌,及時(shí)recycle()回收
- ②:使用三級緩存热凹,內(nèi)存-sd卡-網(wǎng)絡(luò)
內(nèi)存中再次獲取最快,由于內(nèi)存有限可能被gc回收泪电,sd卡中的圖片不會回收般妙,當(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
來設(shè)置點(diǎn)擊與正常時(shí)背景圖,因?yàn)樵赽utton初始化時(shí)會將選中狀態(tài)與正常狀態(tài)的兩張圖都加載都內(nèi)存中旺隙,無疑在無意中加大了內(nèi)存的占用怯疤,可xml中設(shè)置正常的背景,在setOnTouchListener
監(jiān)聽中通過代碼動態(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;
}
});
- 圖片解碼率也會影響圖片所占內(nèi)存
常見的png抠刺,JPG塔淤,webp等格式的圖片在設(shè)置到UI上之前需要經(jīng)過解碼過程,而圖片采用不同的碼率速妖,也會造成對內(nèi)存的占用不同高蜂。- ARGB_4444 格式的解碼率,這種格式的圖片罕容,看起來質(zhì)量太差备恤,已經(jīng)不推薦使用稿饰。 而強(qiáng)烈推薦使用ARGB_8888來代替。一個(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é)。 對于半透明顏色的圖片來說游昼,該格式的圖片能夠達(dá)到比較好的呈現(xiàn)效果甘苍,相對于ARGB_8888來說也能減少一半的內(nèi)存開銷,因此它是一個(gè)不錯(cuò)的選擇烘豌。推薦使用
大量數(shù)據(jù)優(yōu)化
- 分頁加載
- 緩存方式
列表項(xiàng)優(yōu)化
- listview的優(yōu)化
- convertview的復(fù)用(View的復(fù)用)
- viewholder類的使用载庭,減少查找控件的次數(shù)(
findviewbyid()
次數(shù)),將holder與view綁定來實(shí)現(xiàn)(.setTag()
廊佩、.getTag()
) - 數(shù)據(jù)分頁加載
- RecycleView的優(yōu)化
其他優(yōu)化
- 網(wǎng)絡(luò)優(yōu)化
- 同一個(gè)頁面數(shù)據(jù)盡量放到一個(gè)接口中去處理
- 使用Application Context代替Activity Context
- 謹(jǐn)慎使用static 關(guān)鍵字
- static使用不當(dāng)容易造成內(nèi)存泄漏
- 數(shù)據(jù)庫優(yōu)化
- 電量優(yōu)化
- 多線程并發(fā)引發(fā)的性能等
正在持續(xù)跟新中……