ListView 性能優(yōu)化:
1.使用RecyclerView,使用ViewHolder
2.為了提高流暢度,在滑動(dòng)的時(shí)候不顯示大圖
3.將ListView的scrollingCache和animateCache設(shè)置為false
4.降低Item的布局層次
5.避免在getView中處理太多的邏輯和運(yùn)算
Main Looper 響應(yīng)優(yōu)化:
1.使用HandlerThread 來分擔(dān)UI線程的壓力
2.使用IntentService 代替Service
3.避免重復(fù)inflate,可以對(duì)inflate做緩存
4.在自定義View內(nèi)處理邏輯過多的時(shí)候,可以嘗試使用SurfaceView來代替View
5.在操作耗時(shí)的邏輯時(shí)使用Thread或者HandlerThread處理,對(duì)現(xiàn)成過多的情況下可以考慮線程池來復(fù)用線程
6.酌情使用緩存,復(fù)用,對(duì)象池。
7.優(yōu)化數(shù)據(jù)結(jié)構(gòu)和執(zhí)行算法
8.盡可能的使用jni來實(shí)現(xiàn)一些邏輯和算法
9.使用Window Background ViewStub 來提升啟動(dòng)速度。
10.為UI提供更多更豐富的loading來過渡耗時(shí)的網(wǎng)絡(luò)請(qǐng)求
11.自定義View的時(shí)候不要在onDraw中做耗時(shí)的操作同時(shí)也要避免過度的GC(盡可能的減少對(duì)new 的使用)
布局優(yōu)化:
1.避免過度繪制(對(duì)于過度繪制的部分可以使用裁剪處理),可以使用Android自帶的系統(tǒng)工具查看繪制情況
2.優(yōu)化布局層次
3.避免無用的布局嵌套
4.include 重用布局
5.使用Hierarchy View進(jìn)行布局層次分析
6.使用ViewStup標(biāo)簽來做動(dòng)態(tài)加載
7.酌情使用merge標(biāo)簽來減少布局層次
8.減少不必要的硬件縮放,盡可能的提供更完整的分辨率資源
9.讓布局和View更簡單(Icon 與 Text)
網(wǎng)絡(luò)優(yōu)化:
1.如果條件允許,盡可能的使用C++ Socket來處理一些合適的服務(wù)器通信
2.當(dāng)需要批量的網(wǎng)絡(luò)請(qǐng)求時(shí),盡可能的做同步處理避免創(chuàng)建過多的線程
3.將傳輸?shù)膉son/xml等數(shù)據(jù)進(jìn)行壓縮(可提高網(wǎng)絡(luò)傳輸效率提升用戶體驗(yàn))
4.使用增量更新解決大數(shù)據(jù)更新的問題(比如更新App,同步大數(shù)據(jù)庫)
5.將更多的耗時(shí)任務(wù)分布式管理(比如說預(yù)初始化,當(dāng)你有大的耗時(shí)并且頻次較高的任務(wù),可以分布在其他不耗時(shí)的時(shí)機(jī)去做,把握好時(shí)機(jī)最重要)
6.善用第三方網(wǎng)絡(luò)請(qǐng)求框架
內(nèi)存優(yōu)化:
1.避免內(nèi)存抖動(dòng)(在同一時(shí)間內(nèi)大量申請(qǐng)內(nèi)存)
2.使用Lru或者WeakRef來管理大的內(nèi)存(例如Bitmap)
3.在使用Bitmap時(shí)盡可能的進(jìn)行采樣率或者尺寸壓縮(圖片壓縮可采用C++的赫夫曼壓縮方式)
4.酌情使用Bitmap的色彩模式ARGB_8888適合顯示更豐富的色彩 ARGB_4444適用在用戶分辨模式較低的情景,但是在一些場合可以節(jié)省很大的內(nèi)存開銷。
5.在合適的情況下可以考慮使用SparseArray,ArrayMap來代替Java的一些數(shù)據(jù)結(jié)構(gòu)。
6.避免在Hander或者Thread中對(duì)Context的引用,如果能用ApplicationContext代替更好,如果不能最好做Weak或者Lru的處理
7.合理利用static final 修飾符
8.在一些合適的場合下盡可能的使用svg來代替png圖片
9.減少不必要的全局變量
10.謹(jǐn)慎管理單利類的成員和內(nèi)存(Context 是否可以使用ApplicationContext,加強(qiáng)對(duì)單利中的緩存池的管理,比如說List<Lisenter>,有add就要有remove)
11.避免創(chuàng)建不必要的對(duì)象(StringBuilder 在字符串拼裝時(shí)優(yōu)于'+')
12.避免使用過多的枚舉
13.for循環(huán)中采用c的分離方式設(shè)計(jì)(for(int i;xx.getSize();i++)) getSize 可以被分離,考慮是否可以使用for-each。
14.合理使用第三方的處理類庫
15.對(duì)數(shù)據(jù)庫對(duì)象的操作要謹(jǐn)慎比如Cursor對(duì)象
15.對(duì)于IO流操作要謹(jǐn)慎,及時(shí)close
16.嘗試使用靜態(tài)內(nèi)部類代替內(nèi)部類
17.盡可能的選用一些C++優(yōu)秀的開源項(xiàng)目來提升性能和內(nèi)存
18.當(dāng)需要處理gif圖片時(shí)就可以嘗試使用libgif的C++開源項(xiàng)目渲染
19.嘗試變更App的布局方式(可能要與產(chǎn)品溝通實(shí)現(xiàn)方案,盡量避免ViewPager嵌套ViewPager,TabCard嵌套TabCard這種需求)
20.在做數(shù)據(jù)轉(zhuǎn)移時(shí)嘗試是否可以使用System.arraycopy()
21.盡可能的使用Java代碼來寫布局
22.檢查你得廣播中是否有一些惡性的代碼?還有是否解除了廣播關(guān)系