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對象。

歡迎關注技術公衆號,微信號搜索ColorfulCode 代碼男人

分享技術文章,投稿分享,不限技術種類,不限技術深度,讓更多人因爲分享而受益。