你所需要知道的Android效能優化方案
前言
Android效能優化的方案比較多,在開發過程中,主要考慮從以下幾個方面優化
1.佈局優化
2.繪製優化
3.記憶體洩漏優化
4.響應速度優化
5.Listview優化
6.Bitmap優化
7.執行緒優化
接下來我們從這幾個方面為大家簡單介紹優化方案
1.佈局優化
大家肯定都知道Android中有許多佈局,比如Linerlayout、RelativeLayout等,佈局優化就是減少佈局檔案層級,層級減少了,那麼程式繪製時就快了許多,所以可以提高效能。
在佈局程式碼中,使用什麼佈局基本遵守以下規則:
1.如果佈局中既可以使用LinearLayout也可以使用RelativeLayout,那麼就採用LinearLayout,這是因為RelativeLayout的功能比較複雜,它的佈局過程需要花費更多的CPU時間。
2.如果佈局需要通過巢狀的方式來完成。這種情況下還是建議採用RelativeLayout,因為ViewGroup的巢狀就相當於增加了佈局的層級,同樣會降低程式的效能。
3.使用<include>或<merge>標籤和ViewStub,提取佈局中公共部分的佈局,可提高佈局初始化效率。
2.繪製優化
繪製優化就是不要再view的onDraw方法中做大量操作。
第一、不要在onDraw方法中建立新的物件,因為onDraw方法可能被頻繁呼叫,這樣會產生大量的臨時檔案,導致記憶體佔用過多,程式執行效率降低。
第二、儘可能的不做耗時的操作,大數量的迴圈也會佔用CPU的時間
3.記憶體洩漏優化
記憶體洩漏優化換句話說,就是什麼情況可能會導致記憶體洩漏,相信大家都比較清楚,因為這也算是初級比較經典的面試題了。主要有以下幾種情況:
1.不要再Acticity中宣告靜態變數,這樣會是的Activity無法完全銷燬釋放
2.單例設計模式一起的記憶體洩漏,單例設計模式的靜態特性會使他的生命週期和應用程式的生命週期一樣長,這就說明了如果一個物件不在使用了,而這時單例物件還在持有該物件的引用,這時GC就會無法回收該物件,造成了記憶體洩露的情況。所以使用單例模式時,傳入的context應該使用ApplicationContext
3.非靜態內部類建立的靜態例項造成的記憶體洩漏
4.Handler造成的記憶體洩漏,不要在Activity中用非靜態匿名內部類的方式去引用hanlder,比如
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadData();
}
private void loadData(){
Message message = Message.obtain();
mHandler.sendMessage(message);
}
}
這樣hanlder會持有Activity的引用,handler是執行在一個Looper執行緒中的,而Looper執行緒是輪詢來處理訊息佇列中的訊息的,假設我們處理的訊息有10條,而當他執行到第6條的時候,使用者退出銷燬了當前的Activity,這個時候訊息還沒有處理完,handler還在持有Activity的引用,這個時候就會導致無法被GC回收,造成了記憶體洩漏。
4.響應速度優化
響應速度優化的核心思想是避免在主執行緒中做耗時操作,Android規定,Activity如果5秒鐘之內無法響應螢幕觸控事件或者鍵盤輸入事件就會出現ANR,而BroadcastReceiver如果10秒,Service時20s當然這是小概率事件,如果在相應時間內未得到反映就會出現ANR。當有耗時操作時,可以單獨開啟一個執行緒去操作。
5.listview優化
listview優化相信大家也都比較熟悉了,也是比較經典的面試題,在這裡就不詳細贅述了,主要有
複用view,首先判斷view是否為空,如果不為空直接引用,為空再建立
使用ViewHolder類,settag的方式儲存佈局的控制元件初始化資訊,避免每次都去findviewbyid影響效率
6.Bitmap優化
其實思想也很簡單,那就是採用BitmapFactory.Options來載入所需尺寸的圖片。這裡假設通過ImageView來顯示圖片,很多時候ImageView並沒有圖片的原始尺寸那麼大,這個時候把整個圖片載入進來後再設給imageView,這顯然是沒必要的,因為ImageView並沒有辦法顯示原始的圖片。通過BitmapFactory.Options就可以按一定的取樣率來載入縮小後的圖片,將縮小後的圖片在ImageView中顯示,這樣就會降低記憶體佔用從而在一定程度上避免OOM,提高了Bitmap載入時的效能。
7.執行緒優化
執行緒優化的思想是採用執行緒池,避免程式中存在大量的Thread。執行緒池可以重用內部的執行緒,從而避免了執行緒的建立和銷燬所帶來的效能開銷,同時執行緒池還能有效地控制執行緒池的最大併發數,避免大量的執行緒因互相搶佔系統資源從而導致阻塞現象的發生。因此在實際開發中,我們要儘量採用執行緒池,而不是每次都要建立一個Thread物件。
喜歡的話請幫忙轉發一下能讓更多有需要的人看到吧,有些技術上的問題大家可以多探討一下。


以上Android資料以及更多Android相關資料及面試經驗可在QQ群裡獲取:936903570。有加群的朋友請記得備註上簡書,謝謝