Android性能優化總結

ps:本文是在閱讀了《Android開發藝術探索》之後做的總結,感謝!


佈局優化
繪製優化
內存泄露優化
響應速度優化
線程優化
View優化


佈局優化

首先,選擇性能較低的ViewGroup,比如說,LinearLayout和RelativeLayout兩個佈局,建議選擇LinearLayout,因爲Relativelayout的功能比較複雜,它的佈局過程需要花費更多的CPU時間。LienarLayout和FrameLayout都是一種簡單高效的ViewGroup。
include 標籤
作用:include 標籤可以將一個指定的佈局文件加載到當前的佈局文件中。

<include
        android:id="@+id/my_image"
        layout="@layout/image"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        />
/**比如上述,就是導入了一個image的佈局,這裏,include 可以幾個屬性,其中layout:"表
示引入那個佈局",其還可以用android:layout_開頭的屬性,比如,你引入的佈局高200dp,
但是這樣設置的是100dp那麼就只會展示100dp大小的內容,如果沒有的話,就會展示200dp,
這裏的id屬性,如果被包含佈局中也有id,那麼以include的爲準。這種方法效率高的一個很重
要原因是這個佈局文件中內容不會一直重複的加載了*/

merge 標籤
一般是和include標籤一起使用從而減少佈局的層級。
在這裏推薦使用View Hierarchy查看一個界面上的view層次。

通過AndroidStudio中的Tools--android--Android Device Monitor便可以打開了,既可以去看層級結構。

比如你發現了,當前佈局是一個豎直方向的LinearLayout,但是被包含的佈局文件也是豎直方向的LinearLayout,那麼就會發現被包含的是多餘的,可以用merge標籤替代。
通俗點講就是,你在使用include 標籤時候,如果發現了你include的佈局,與包含它的佈局樣式是一樣的,那麼include佈局的根可以用merge代替,這樣會去掉多餘的那層LinearLayout,
經過是實驗證明,如果外界是豎直方向的LinearLayout,但include是merge,那麼展示的include佈局就是豎直方向的,如果include是水平方向的,但不實用merge了,那麼展示的就是水平的。


ViewStub
這是一個View,它非常輕量級並且寬高爲0,因此他本身不參與任何的佈局和繪製過程,
但是它的作用是可以按需加載所需的佈局文件,注意,不是加載view。可以叫做懶加載。

 <ViewStub
        android:id="@+id/viewstubs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inflatedId="@+id/aaaa"
        android:layout="@layout/image"
        />
/**
其中的layout引入一個佈局,但是並不會展示在界面上。
一些android:layout_marin*的屬性,如果需要應該加載ViewStub上,而不是加載引入的那個
layout中。
給ViewStub設置OnClickListener監聽沒有效果,設置OnInflateListener()方法也沒有反
應,暫時我是沒有發現,
ViewStub 設置的寬高,那麼子佈局就展示多大部分的內容,但是一個特殊的情況,那就是
ViewStep使用了wrap_content,但是內部的layout中的高度用的是match_parent,那麼就會
出現展示很小的界面,並且會全部展示(但是是壓縮展示),就是必須告訴一個特定的值纔可
以,ViewStub有值(以他的爲準),如果ViewStub選擇100dp,但是佈局是300dp,那麼就會展
示100dp內容區域的內容。
*/

關鍵是如何讓ViewStub中的layout加載出來,可以通過:

private ViewStub img;
img = (ViewStub) findViewById(R.id.viewstubs);
img.setVisibility(View.VISIBLE);//裏面的內容就會出來
img.setVisibility(View.GONE);//裏面的內容就會消失

由於不能給ViewStub設置監聽,因此一般是通過別的view來控制其顯示的。
還有,ViewStub包含的layout,裏面的內容是可添加監聽的,
只需找到相對應的id 就可以。
你在佈局時候,在兩個TextView之間加上ViewStub,你什麼也看不見,不影響佈局,當
ViewStub裏面內容展示時候,還是在兩個TextView之間,下面的TextView向下留出展示 ViewStub的空間


繪製優化

View
在View的onDraw()方法中,不要創建對象,因爲可能會頻繁的調用,這樣一瞬間就會有大量的對象了,會佔有很多的內存和系統gc被頻繁的調用。降低了程序的效率。
另外最好不要執行耗時操作,不能執行成千上萬的循環操作,這樣回強佔cpu時間,Google官方定義的性能優化典範中,View的繪製幀率保證60ms最佳,這要求每幀時間不超過16ms

還有比如說ListView的優化、Bitmap的優化之類,都很關鍵。


內存泄露優化

一般來講內存泄漏,有兩個方面:
(1)靜態變量導致的內存泄露
(2)單例模式導致的內存泄漏
(3)屬性動畫導致的內存泄漏
就拿屬性動畫來講,它會持有View,但是View會持有Activity,如果動畫沒有調用animator.cancel()來停止動畫,就一直存在那麼activity就會泄露,
所謂的內存泄漏,最主要是activity不能及時的被回收。


響應速度優化

這個的核心就是,避免在主線程中做耗時操作,響應速度體現在Activity啓動速度上面,如果在主線程中做了太多事情,會導致Activity啓動時候出現黑屏之類的現象
Android規定,Activity如果5秒之內無法響應屏幕觸摸事件或者鍵盤輸入事件就會導致ANR(Application not Responding),
ANR,其實進程會在/data/anr目錄下面建立traces.txt,文件,可以通過adb pull /data/anr/traces.txt 進行查看。
adb ,存在於你的sdk 裏面platform-tools 中,是帶有的一個程序,可以通說cmd 啓動。


線程優化

最好採用線程池,避免程序中存在大量的Thread,線程池可以重用內部線程,避免了縣城創建和銷燬所帶來的性能開銷。

發佈了28 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章