最专业的八方代购网站源码!

资讯热点
20个应用程序性能优化建议

发布时间:2022-3-4 分类: 行业资讯

为什么你的应用程序卡住?为什么占用大量内存?应该如何解决?本文将为您提供答案。

 20条建议

  1. itmap的合理使用:使用Bitmap过后,就需要及时的调用recycle()方法来释放Bitmap占用的内存空间,而不要等Android系统来进行释放。

代码示例:

//首先确定它是否已被回收

如果(位图!=null&&!bitmap.isRecycled()){

Bitmap.recycle();

Bitmap=null;

}

的System.gc();

  2. 对常量使用static final修饰符

静态final int intVal=42;

静态最终字符串strVal=“ Hello,world!&rdquo ;;

将方法或类声明为final不会导致性能提升,但会帮助编译器优化代码。例如,如果编译器知道getter方法不会被重载,编译器将内联调用它。

  3. 静态方法代替虚拟方法

如果您不需要访问对象的字段,请将方法设置为静态,并且呼叫将加速15%到20%。这也是一种很好的做法,您可以从方法声明中看到,调用此方法不需要更新此对象的状态。

 4. 减少不必要的全局变量

尽量避免静态成员变量引用消耗过多实例的资源,例如Context,因为Context引用超出了自己的生命周期,导致Context泄漏。因此,尝试使用Context类型的Application。通过调用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(int i=0; i< this.getCount(); i ++){}

正例:int count=this.mCount; int count=this.getCount();

对于(int i=0; i< count; i ++){

}

 9. 资源类对象在不使用的时候,应该及时关闭它们,方便它们的缓存数据能够及时回收。

例如,Cursor,File文件等最终需要关闭资源对象,以避免在异常情况下资源对象未发布的隐患

 10. 注册广播接收器、注册观察者等需要在不使用的时候取消注册。

例如:假设在Activity中,侦听系统的电话服务可以在Activity中定义PhoneStateListener对象,并在TelephoneManager服务中注册它。对于Activity对象,理论上,Activity对象将在Activity退出后释放。但是,如果在释放Activity对象时忘记取消先前注册的PhoneStateListener对象,则GC不会回收活动。如果您继续进入和退出此活动,由于无法回收大量活动对象,最终会导致频繁的GC情况甚至内存不足。

 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优势:新线程;顺序处理意图;执行后自动退出。

 18. 尽量不要因一两个特性而使用大体积类库。

  19. 对象不用时最好显式置为Null可以减少GC开销。

  20. 多了解并使用类库。

一些例子

1.在处理字符串时,尝试使用特殊的实现方法,如String.indexOf()和String.lastIndexOf()。这些方法都是用C/C ++实现的,比Java循环快10到100倍。

2.使用JIT的Nexus One上的System.arraycopy方法快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的底部执行。

内存优化工具

推荐的内存分析工具:适用于Android Studio的内存监视器

推荐的内存泄漏分析工作:MAT for eclipse,Android Studio

内存泄漏监控工具:LeakCanary

本文最初由@虚假的柔柔发表。未经许可,禁止复制。

该地图来自unsplash,基于CC0协议

« 前网易LOFTER运营总监:社区运营秘籍为0 | 公司代购源码网站降级后的正确处理方法 »