20条App性能优化的建议
2017-12-10 21:11:01 来源:易采站长网友投稿 作者:admin
您的app为何会卡?为何占用年夜内存?该当怎样处理?那篇文章会给您谜底。

20条倡议
1. itmap的开理利用:利用Bitmap事后,便需求实时的挪用recycle()办法去开释Bitmap占用的内存空间,而没有要等Android体系去停止开释。
代码示例:
// 先判定能否曾经收受接管
if(bitmap != null && !bitmap.isRecycled()){
bitmap.recycle();
bitmap = null;
}
System.gc();
2. 对常量利用static final建饰符
static final int intVal = 42;
static final String strVal = “Hello, world!”;
将一个办法或类声明为final没有会带去机能的提拔,可是会协助编译器劣化代码。举例道,假如编译器晓得一个getter办法没有会被重载,那末编译器会对其接纳内联挪用。
3. 静态办法替代实拟办法
假如没有需求会见某工具的字段,将办法设置为静态,挪用会加快15%到20%。那也是一种好的做法,果为您能够从办法声明中看出挪用该办法没有需求更新此工具的形态。
4. 削减没必要要的齐局变量
只管制止static成员变量援用资本消耗过量的真例,好比Context,果为Context的援用超越它自己的死命周期,会招致Context走漏。以是只管利用Application那种Context范例。 能够经由过程挪用Context.getApplicationContext()或 Activity.getApplication()沉紧获得Application工具。
5. 制止创立没必要要的工具: 便是制止创立短寿的暂时工具。削减工具的创立便能削减渣滓搜集,进而削减对用户体验的影响。
比方:频仍操纵一个字符串时,利用StringBuffer替代String。
关于一切一切根本范例的组开:int数组比Integer数组好,那也归纳综合了一个根本究竟,两个仄止的int数组比 (int,int)工具数组机能要好许多。.制止利用浮面数
凡是的经历是,正在Android装备中,浮面数会比整型缓两倍。
7. 利用真体类比接心好
假定您有一个HashMap工具,您能够将它声明为HashMap大概Map:
Map map1 = new HashMap();
HashMap map2 = new HashMap();
哪一个更好呢?
根据传统的不雅面Map会更好些,果为那样您能够改动他的详细真现类,只需那个类担当自Map接心。传统的不雅面关于传统的法式是准确的,可是它其实不合适嵌进式体系。挪用一个接心的援用会比挪用真体类的援用多破费一倍的工夫。假如HashMap完整合适您的法式,那末利用Map便出有甚么代价。假如有些处所您不克不及肯定,先制止利用Map,剩下的交给IDE供给的重构功用好了。(固然大众API是一个破例:一个好的API经常会捐躯一些机能)
8. 会见成员变量比会见当地变量缓很多
for轮回:没有要正在for的第两个前提中挪用任何办法
反例:for(int i =0; i < this.getCount(); i++) {}
正例:int count = this.mCount; int count = this.getCount();
for(int i =0; i < count; i++) {
}
9. 资本类工具正在没有利用的时分,该当实时封闭它们,便利它们的缓存数据可以实时收受接管。
比方:Cursor、File文件等皆需求正在finally中封闭资本性工具,制止正在非常状况下资本工具已被开释的隐患
10. 注册播送领受器、注册不雅察者等需求正在没有利用的时分打消注册。
比方:假定正在Activity中,监听体系的德律风效劳,能够正在Activity中界说一个PhoneStateListener的工具,同时将它注册到TelephoneManager效劳中。关于Activity工具,实际上请求Activity退出后该Activity的工具便会被开释失落。可是假如正在开释Activity工具时,遗忘打消之前注册的PhoneStateListener工具,则会招致Activity没法被GC收受接管。假如不竭的收支那个Activity,则终极会因为年夜量的Activity工具出有法子被收受接管而惹起频仍的GC状况,以至招致Out Of Memory。
11. 有用的操纵体系自带的资本,Android体系内置了年夜量的资本,好比字串、色彩界说、经常使用Icon图片、动绘款式、及简朴的规划,出有特别请求,资本能够正在法式中间接援用。那样不只削减内存的开消,借能够削减apk的巨细。
12. 视图复用,利用ViewHolder真现ConvertView复用,那根本上是一切容器控件的处置方法,如ListView、GridView等。
13. 利用最劣的数据范例,比力少的工具数时,ArrayMap交换HashMap的利用,制止利用列举,列举变量十分便利,但没有幸的是它会捐躯施行的速率战并年夜幅删减文件体积。
14. 图片内存劣化
Android供给的多种位图格局中,最下的是RGB_8888,也是体系默许的位图格局,其他几种皆削减位图通讲,能够削减内存开消,如一些部分图片、小屏幕脚机大概对图片量量请求没有下的场景,都可以利用RGB_565,大概ARGB_4444等图象格局。
图片缩放:inSampleSize、inScaled、inDensity战inTargetDensity
位图内存重用:inBitmap的利用,能够分离LruCache真现。
保举开源库:picasso、Glide
15. Android 收集通讯框架Volley。
16. 工具池、线程池的开理利用。
17. 利用IntentService替换Service。
IntentService劣势:新开线程;次第处置Intent;施行完主动退出。
18. 只管没有要果一两个特征而利用大致积类库。
19. 工具不消时最好隐式置为Null能够削减GC开消。
20. 多理解并利用类库。
一些例子
1. 当处置字串的时分,只管利用String.indexOf(),String.lastIndexOf()等特别真现的办法。那些办法皆是利用C/C++真现的,比起Java轮回快10到100倍。
2. System.arraycopy办法正在有JIT的Nexus One上,自止编码的轮回快9倍。
3. android.text.format包下的Formatter类,供给了IP地点转换、文件巨细转换等办法;DateFormat类,供给了各类工夫转换,皆长短常下效的办法。
4. TextUtils类,关于字符串处置Android为我们供给了一个简朴真用的TextUtils类,假如处置比力简朴的内容不消来考虑正则表达式无妨尝尝那个正在android.text.TextUtils的类
5. 下机能MemoryFile类,关于I/O需求频仍操纵的,次要是战内部存储相干的I/O操纵,MemoryFile经由过程将 NAND或SD卡上的文件,分段映照到内存中停止修正处置,那样便用下速的RAM替代了ROM或SD卡,机能天然进步很多,关于Android脚机而行同时借削减了电量耗损。该类真现的功用没有是许多,间接从Object上担当,经由过程JNI的方法间接正在C底层施行。
内存劣化东西
保举内存阐发东西:Memory Monitor 合用于Android Studio
保举内存保守阐发事情:MAT 合用于eclipse、Android Studio
内存保守监控东西:LeakCanary
本文由 @虚假的温顺 本创公布。已经答应,制止转载。
题图去自 unsplash,基于 CC0 和谈











闽公网安备 35020302000061号