20条App性能优化的建议

发布时间:2024-02-22 点击:119
注:你的app为什么会卡?为什么占用大内存?应该怎么解决?这篇文章会给你答案。
20 条建议
1. itmap的合理使用:使用bitmap过后,就需要及时的调用recycle()方法来释放bitmap占用的内存空间,而不要等android系统来进行释放。
代码示例:
//先判断是否已经回收
if(bitmap!=null&&!bitmap.isrecycled()){
bitmap.recycle();
bitmap=null;
}
system.gc();
2. 对常量使用static final修饰符
static finalint intval = 42;
static finalstring strval = “hello, world!”;
将一个方法或类声明为final不会带来性能的提升,但是会帮助编译器优化代码。举例说,如果编译器知道一个getter方法不会被重载,那么编译器会对其采用内联调用。
3. 静态方法代替虚拟方法
如果不需要访问某对象的字段,将方法设置为静态,调用会加速15%%u523020%%u3002这也是一种好的做法,因为你可以从方法声明中看出调用该方法不需要更新此对象的状态。
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(inti=0;i<this.getcount();i ){}
正例:intcount=this.mcount; intcount=this.getcount();
for(inti=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

vps便宜vps云服务器搭建
在SEO优化中,重要的数据分析如何做
如何知道桌面弹窗广告是什么软件弹出的 怎样查看弹窗广告是哪个软件
台式机怎么换显卡 台式电脑独立显卡怎么更换
站点加载不出-其他问题
云服务器链接不上-云服务器问题
阿里云服务器ecs环境配置教程
麻烦检测一下域名-域名及账户问题