新聞中心
Android性能優(yōu)化之耗電優(yōu)化
通過上圖先把用戶-電量這一流程抽象出來,設(shè)備的耗電根本原因在于對硬件的使用,耗電越嚴(yán)重說明對硬件使用的越頻繁。用戶對app頻繁使用說明了你用戶黏性做的好,我們不能左右,所以我們要在app對硬件調(diào)用上做優(yōu)化來達(dá)到節(jié)省電量的目的。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、碾子山ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的碾子山網(wǎng)站制作公司
先看下移動設(shè)備元件耗電大戶有哪些:
屏幕是耗電最大元件之一,但是用戶要和app交互就要點亮屏幕,有人可能會覺得屏幕的明暗是用戶自己根據(jù)喜好設(shè)定的,我們無可奈何。其實不然,在有些時候是可以通過UI的設(shè)計來減少屏幕電能消耗的。
在這之前我們先來看下目前常用手機屏幕材質(zhì):LCD和LED(OLED)。
無線網(wǎng)絡(luò)主要是WIFI和移動運營商網(wǎng)絡(luò),通常情況下使用移動網(wǎng)絡(luò)要比WIFI耗電要多一些。
這三種狀態(tài)有一個轉(zhuǎn)換流程:
通過上面了解網(wǎng)絡(luò)連接過程,應(yīng)該心里有了大概的優(yōu)化建議。
精簡后
①請求一個圖片時,客戶端提供一個分辨率大小,服務(wù)器根據(jù)分辨率把裁剪縮放后的圖片給客戶端返回。也可以使用Android端使用Bitmap.Option自行獲取縮放的圖片
②使用webp圖片。
后面的章節(jié)會寫一些關(guān)于電量檢測分析工具的使用。
為了耗電優(yōu)化干的這些活用戶感知不到,但是如果不去優(yōu)化,肆意使用,那用戶就很容易感知到了。
Android性能優(yōu)化總結(jié)
常用的Android性能優(yōu)化方法:
一、布局優(yōu)化:
1)盡量減少布局文件的層級。
層級少了,繪制的工作量也就少了,性能自然提高。
2)布局重用 include標(biāo)簽
3)按需加載:使用ViewStub,它繼承自View,一種輕量級控件,本身不參與任何的布局和繪制過程。他的layout參數(shù)里添加一個替換的布局文件,當(dāng)它通過setVisibility或者inflate方法加載后,它就會被內(nèi)部布局替換掉。
二、繪制優(yōu)化:
基于onDraw會被調(diào)用多次,該方法內(nèi)要避免兩類操作:
1)創(chuàng)建新的局部對象,導(dǎo)致大量垃圾對象的產(chǎn)生,從而導(dǎo)致頻繁的gc,降低程序的執(zhí)行效率。
2)不要做耗時操作,搶CPU時間片,造成繪制很卡不流暢。
三、內(nèi)存泄漏優(yōu)化:
1)靜態(tài)變量導(dǎo)致內(nèi)存泄漏 ? 比較明顯
2)單例模式導(dǎo)致的內(nèi)存泄漏?單例無法被垃圾回收,它持有的任何對象的引用都會導(dǎo)致該對象不會被gc。
3)屬性動畫導(dǎo)致內(nèi)存泄漏 ?無限循環(huán)動畫,在activity中播放,但是onDestroy時沒有停止的話,動畫會一直播放下去,view被動畫持有,activity又被view持有,導(dǎo)致activity無法被回收。
四、響應(yīng)速度優(yōu)化:
1)避免在主線程做耗時操作 包括四大組件,因為四大組件都是運行在主線程的。
2)把一些創(chuàng)建大量對象等的初始化工作放在頁面回到前臺之后,而不應(yīng)該放到創(chuàng)建的時候。
五、ListView的優(yōu)化:
1)使用convertView,走listView子View回收的一套:RecycleBin 機制
主要是維護(hù)了兩個數(shù)組,一個是mActiveViews,當(dāng)前可見的view,一個是mScrapViews,當(dāng)前不可見的view。當(dāng)觸摸ListView并向上滑動時,ListView上部的一些OnScreen的View位置上移,并移除了ListView的屏幕范圍,此時這些OnScreen的View就變得不可見了,不可見的View叫做OffScreen的View,即這些View已經(jīng)不在屏幕可見范圍內(nèi)了,也可以叫做ScrapView,Scrap表示廢棄的意思,ScrapView的意思是這些OffScreen的View不再處于可以交互的Active狀態(tài)了。ListView會把那些ScrapView(即OffScreen的View)刪除,這樣就不用繪制這些本來就不可見的View了,同時,ListView會把這些刪除的ScrapView放入到RecycleBin中存起來,就像把暫時無用的資源放到回收站一樣。
當(dāng)ListView的底部需要顯示新的View的時候,會從RecycleBin中取出一個ScrapView,將其作為convertView參數(shù)傳遞給Adapter的getView方法,從而達(dá)到View復(fù)用的目的,這樣就不必在Adapter的getView方法中執(zhí)行LayoutInflater.inflate()方法了。
RecycleBin中有兩個重要的View數(shù)組,分別是mActiveViews和mScrapViews。這兩個數(shù)組中所存儲的View都是用來復(fù)用的,只不過mActiveViews中存儲的是OnScreen的View,這些View很有可能被直接復(fù)用;而mScrapViews中存儲的是OffScreen的View,這些View主要是用來間接復(fù)用的。
2)使用ViewHolder避免重復(fù)地findViewById
3)快速滑動不適合做大量異步任務(wù),結(jié)合滑動監(jiān)聽,等滑動結(jié)束之后加載當(dāng)前顯示在屏幕范圍的內(nèi)容。
4)getView中避免做耗時操作,主要針對圖片:ImageLoader來處理(原理:三級緩存)
5)對于一個列表,如果刷新數(shù)據(jù)只是某一個item的數(shù)據(jù),可以使用局部刷新,在列表數(shù)據(jù)量比較大的情況下,節(jié)省不少性能開銷。
六、Bitmap優(yōu)化:
1)減少內(nèi)存開支:圖片過大,超過控件需要的大小的情況下,不要直接加載原圖,而是對圖片進(jìn)行尺寸壓縮,方式是BitmapFactroy.Options 采樣,inSampleSize 轉(zhuǎn)成需要的尺寸的圖片。
2)減少流量開銷:對圖片進(jìn)行質(zhì)量壓縮,再上傳服務(wù)器。圖片有三種存在形式:硬盤上時是file,網(wǎng)絡(luò)傳輸時是stream,內(nèi)存中是stream或bitmap,所謂的質(zhì)量壓縮,它其實只能實現(xiàn)對file的影響,你可以把一個file轉(zhuǎn)成bitmap再轉(zhuǎn)成file,或者直接將一個bitmap轉(zhuǎn)成file時,這個最終的file是被壓縮過的,但是中間的bitmap并沒有被壓縮。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);
七、線程優(yōu)化:
使用線程池。為什么要用線程池?
1、從“為每個任務(wù)分配一個線程”轉(zhuǎn)換到“在線程池中執(zhí)行任務(wù)”
2、通過重用現(xiàn)有的線程而不是創(chuàng)建新線程,可以處理多個請求在創(chuàng)建銷毀過程中產(chǎn)生的巨大開銷
3、當(dāng)使用線程池時,在請求到來時間 ,不用等待系統(tǒng)重新創(chuàng)建新的線程,而是直接復(fù)用線程池中的線程,這樣可以提高響應(yīng)性。
4、通過和適當(dāng)調(diào)整線程池的大小 ,可以創(chuàng)建足夠多的線程以使處理器能夠保持忙碌狀態(tài),同時還可以防止過多線程相互競爭資源而使應(yīng)用程序耗盡內(nèi)存或者失敗。
5、一個App里面所有的任務(wù)都放在線程池中執(zhí)行后,可以統(tǒng)一管理 ,當(dāng)應(yīng)用退出時,可以把程序中所有的線程統(tǒng)一關(guān)閉,避免了內(nèi)存和CPU的消耗。
6、如果這個任務(wù)是一個循環(huán)調(diào)度任務(wù),你則必須在這個界面onDetach方法把這個任務(wù)給cancel掉,如果是一個普通任務(wù)則可cancel,可不cancel,但是最好cancel
7、整個APP的總開關(guān)會在應(yīng)用退出的時間把整個線程池全部關(guān)閉。
八、一些性能優(yōu)化建議:
1)避免創(chuàng)建過多對象,造成頻繁的gc
2)不要過多使用枚舉,枚舉占用的空間比整型大很多
3)字符串的拼接使用StringBuffer、StringBuilder來替代直接使用String,因為使用String會創(chuàng)建多個String對象,參考第一條。
4)適當(dāng)使用軟引用,(弱引用就不太推薦了)
5)使用內(nèi)存緩存和磁盤緩存。
Android性能優(yōu)化(八)--Android圖片內(nèi)存優(yōu)化
2個基本原則
既然需要的內(nèi)存公式已得到,那優(yōu)化就顯而易見了,無非就是減小的這三個參數(shù)的值,具體的策略如下:
這里我們將圖片分為2種情況來探討:
圖片占用的內(nèi)存 大小為:
為什么mipmap不在這種情況的考慮范圍之內(nèi)呢?
因為mipmap是Android系統(tǒng)為了避免Launcher Icon變形而添加的資源目錄,也就是說,mipmap中的圖片不會被縮放。所以Google也不推薦將除Launcher Icon之外的圖片放在mipmap目錄中。
本地圖片通常都是通過Android提供的BitmapFactory來加載的, 這里看幾個常用的API:
圖片的優(yōu)化可通過Options參數(shù)來實現(xiàn)(Options的介紹可參考 從fresco 看圖片優(yōu)化 :
inPreferredConfig的取值為Bitmap.Config類型(這里只考慮以下幾種情況),它是一個枚舉類型,用來設(shè)置每個像素需要的字節(jié)數(shù):
1.jpeg和gif
2.webp
3.png8, png24, png32
網(wǎng)絡(luò)圖片通常我們都是使用開源庫進(jìn)行加載, 所以不需要拿到Bitmap再進(jìn)行縮放或裁剪。
這時可讓后臺實現(xiàn)網(wǎng)絡(luò)圖片的裁剪,即:根據(jù)圖片的請求參數(shù)返回合適的尺寸,最大也只需要控件的大小即可。
再大也沒意義,不僅浪費流量,還占用內(nèi)存。
如果你的APP中有很多圖片,那么可對圖片的寬高根據(jù)設(shè)備的內(nèi)存情況進(jìn)行適當(dāng)?shù)目s小:
盡量為所有分辨率創(chuàng)建資源 資源匹配分辨率 = 減少不必要的縮放,從而提高UI繪制效率
對于一個多圖片的APP來說,圖片所占內(nèi)存的優(yōu)化是一項必不可少的工作。
總的來說,其優(yōu)化也就是通過 縮放 和指定 Bitmap.Config的值 來實現(xiàn)的,只是不同位置,不同格式的圖片有所差異而已。
;utm_source=weixinqun
本文標(biāo)題:android性能,android性能優(yōu)化工具
網(wǎng)站鏈接:http://www.ef60e0e.cn/article/hoshgp.html