淺析安卓(Android)的性能優(yōu)化
Android性能的優(yōu)化主要分為兩點
1、布局優(yōu)化
2、內存優(yōu)化
布局優(yōu)化
首先來看一下布局優(yōu)化,系統(tǒng)在渲染UI的時候會消耗大量的資源,所以,對布局的優(yōu)化就顯得尤為重要
避免Overdraw
也就是避免過度的繪制,過度的繪制會浪費更多的資源,舉個例子,Android系統(tǒng)會默認繪制Activity
的背景,這時候我們再設置一個背景,這樣默認的背景就屬于過度繪制了,在『開發(fā)者工具』中有一個『調試GPU過度繪制』的選項,我們打開就可以通過顏色來判斷過度繪制的次數
如圖:
所以說我們盡可能的增大藍色區(qū)域,減少紅色區(qū)域
優(yōu)化布局層級
在Android系統(tǒng)中,系統(tǒng)對View進行測量、布局、繪制的時候,都是通過對View
樹的遍歷來進行的,所以說一個布局的層級太多,就會嚴重影響測量、布局、繪制的速度,所以要降低View樹的高度,Google在文檔中建議布局的層級不超過10層,所以還要避免嵌套沒有用的布局
使用include標簽
相信大家都會在項目的時候遇到toolbar,或者一個UI在多個界面使用的問題,遇到這種問題的時候我們一般都會用include(畢竟大神『第一行代碼』教的好),這樣就減少了代碼冗余,而且還利于后期更改
使用ViewStub實現View的延時加載
ViewStub
標簽和View.GONE
的方式差不多,但是ViewStub
只會在顯示的時候去渲染,而GONE
在初始化的時候就已經渲染完畢了,所以相比來說ViewStub
的效率更高。
下面來通過代碼使用一下ViewStub
首先我們定義一個布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
這里面只放了一個TextView
,然后我們在自己的布局中通過ViewStub
來引用他
<Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ViewStub android:id="@+id/vs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout="@layout/view_stub"/>
這里的邏輯是點擊按鈕然后出現ViewStub
引用的布局(也就是我們上面寫的那個布局文件)
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ViewStub vs = (ViewStub) findViewById(R.id.vs); View vsView = vs.inflate(); TextView tv = (TextView) vsView.findViewById(R.id.tv); tv.setText("hahaha"); } });
這里想要把ViewStub
引用的布局顯示出來有兩種辦法,一種是ViewStub.setVisibility();
另一種就是ViewStub.inflate();
這兩種方法的區(qū)別就是inflate()
能返回引用的布局,然后可以通過這個布局來找到里面的子View
來進行操作
運行程序點擊按鈕,就可以看到TextView
已經顯示出來了,并且已經賦值『hahaha』
Hierarchy Viewer
這個工具可以顯示我們的布局,但是只可以在模擬器和工廠的Demo機上用,不過Google的大神提供了一個開源的項目ViewServer,有興趣的可以看一下。
這個就不過多闡述了,有興趣的可以自行查看一下相關的資料
內存優(yōu)化
我們都知道,最近Android的廠商就是在拼配置,其中我們最關注的就是內存幾個G,但是Android手機有的內存很大,但是很卡,這是因為有的手機軟件在手機內存低的情況下不能被殺死,也就是我們說的『防殺』
我們知道內存一般分為這幾個部分
1、寄存器
2、棧
3、堆
4、靜態(tài)存儲區(qū)
5、常量池
其中寄存器運算速度最快,但是我們在程序里無法控制
棧里存放基本數據類型
堆里存放對象和數組,在堆中的一般由Java的GC還管理
靜態(tài)存儲區(qū)在固定的位置存放應用程序中運行時一直存在的數據,Java專門劃分了一個區(qū)域來管理靜態(tài)變量
常量池就是該類型所使用到的常量的集合
Bitmap的優(yōu)化
我們都知道在Android中是造成OOM的最大威脅,因為它占用的內存特別多,所以我們應該:
1、使用適當分辨率大小的圖片
由于Android在做適配的時候會對不同分辨率的文件夾下的圖片來進行縮放適配,如果圖片的分辨率與資源分辨率不匹配的話就會導致消耗更多的資源
2、使用緩存
一般有內存緩存和硬盤緩存
代碼優(yōu)化
1、對常量使用static
2、使用靜態(tài)方法,靜態(tài)方法比普通方法提高15%左右的訪問速度
3、減少沒有必要的成員變量,如果能定義成局部變量就最好定義成局部變量
4、減少不必要的對象
5、少用枚舉、迭代器
6、對Cursor
、Receiver
、File
等對象,要注意回收和取消注冊
7、使用SurfaceView
來代替View進行大量并且頻繁的繪圖操作
8、盡量使用視圖緩存,不是每次都執(zhí)行inflate()
來解析視圖
9、避免使用反射
10、使用RenderScript
、OpenGL
來進行非常復雜的繪圖操作
總結
以上就是對Android性能優(yōu)化的一些點,如果你用AndroidStudio的話,AndroidStudio提供了一個內存監(jiān)視的工具,還是很好用的,如果你沒用AndroidStudio,那么我建議你使用AndroidStudio~
另外優(yōu)化也沒有絕對的完美,每一次優(yōu)化都是基于當前的環(huán)境來做的,要明白溝通是最好的優(yōu)化,不盲從,不隨便,三思而后行。希望這篇文章對大家開發(fā)Android能有所幫助。
相關文章
實例講解Android中的AutoCompleteTextView自動補全組件
AutoCompleteTextView組件被用在輸入框中能實現輸入內容自動補全的功能,類似于大家平時用Google時的輸入聯(lián)想,這里我們來用實例講解Android中的AutoCompleteTextView自動補全組件,特別是實現郵箱地址補全的例子,非常實用2016-05-05Android RxJava創(chuàng)建操作符Timer的方法
這篇文章主要為大家詳細介紹了Android RxJava創(chuàng)建操作符Timer的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12360瀏覽器文本框獲得焦點后被android軟鍵盤遮罩該怎么辦
最近接了個項目,項目需求是這樣的,站點上篩選按鈕點擊后彈出層(fixed),當輸入框獲取焦點以后彈出系統(tǒng)自帶的軟鍵盤,在android上十款瀏覽器挨個測試比對,發(fā)現在360瀏覽器彈出鍵盤以后獲取焦點的文本框被軟鍵盤覆蓋了,下面分享我的解決辦法2015-12-12Android開發(fā)實戰(zhàn)之漂亮的ViewPager引導頁
這篇文章主要介紹了Android開發(fā)實戰(zhàn)中漂亮ViewPager引導頁的制作過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08安卓APP測試之使用Burp Suite實現HTTPS抓包方法
這篇文章主要介紹了安卓APP測試之使用Burp Suite實現HTTPS抓包方法,本文詳解講解了測試環(huán)境和各個軟件的配置方法,需要的朋友可以參考下2015-04-04Android中修改TabLayout底部導航條Indicator長短的方法
Tablayout在我們日常開發(fā)中經常會遇到,下面這篇文章主要給大家介紹了在Android中修改TabLayout底部導航條Indicator長短的方法,文中給出了詳細的示例代碼供大家參考學習,需要的朋友們下面來一起看看吧。2017-06-06