20条App功用优化的主张
2017-12-08 14:35 稿源:人人都是产品司理 0条谈论 撤稿纠错
注:你的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底层履行。
本文链接:http://www.yizheng.org.cn/news/news405.html
上一条:Bing与google的SEO优化规矩有什么不同? 下一条:谷歌 SEO 入门攻略 2018 年版(一):Google 抓取