Android内存优化的个人理解

一 运行前:

1.首先应用的图片应该压缩一下:
个人喜欢使用的压缩网站:TinyPng。比如原来应用图片有50k的,压缩过后可能只有10k左右,原来图片有8k的压缩过后可能只有1k,这就使图片占用的内 存更少了,应用也就更流畅了。

2.只提供xhdpi与xxhdpi的图片即可:
因为现在的主流手机应该都是这两种分辨率了,因此只提供这两种分辨率的图片也够用了。
 注意:如果只有一套图的话最好放到xxhdpi或者更大分辨率的文件夹中,因为放到小分辨率的文件夹的话在大分辨率手机中图片宽高会成比例的放大从而造成占用内存变大。

3.对于一下可重用的资源:
比如可重用的布局抽取成单独的xml,可以减少代码量(对于布局的优化可以搜下merge跟viewstub),同时改动时不必每个文件都找一遍了,能抽取出style的也尽量抽取出来。

4.对于没有用到及不需要的包尽量不要引用:
会导致apk比较大,个人不太喜欢依赖注入框架,一个是引入了很多class,再者初始化的时间变长了,还有就是可能会初始化了一下用不到的对象。

5.混淆代码(这个大家应该都用了)

6.使用点九图片

二 运行时优化:

1.首先要处理图片了:
个人使用的是Glide(相对于UIL使用更方便),对于图片的优化还是不错的,如果你使用的是Picasso可以参考一下这篇文章做下优化:http://blog.csdn.net/q610098308/article/details/51179182。当然如果使用的是Glide也可以用到里边的新进程中查看大图,列表滑动时暂停加载,大图放弃内存缓存及重写onDetachWindow的优化方法的。

注意:重写了onDetachWindow方法的ImageVIew不要再列表项中使用,否则会导致重用的ImageView加载不出图片。

2.再者要避免内存泄漏了:
个人推荐使用LeakCanary检测。否则会使app可用内存越来越小,最终可能会导致OOM异常(对于频繁使用的类Activity或者Fragment尤其要检查一下)。要在Activity或者Fragment中的onDestroy方法中进行反注册相应的广播,停止服务,取消延时任务或者接口请求或者清楚内部类,或者清除单例对于此类的引用等。当垃圾回收器在内存回收时检测此类没有被引用就会回收它。

3.使用ArrayMap及SparseArray或SparseBooleanArray,SaprseIntArray代替key为Integer的Map。

4.循环拼接字符串时使用StringBuilder.

5.对于类中频繁使用的对象建议抽取成全局变量,否则可能会导致内存抖动。

6.能使用ApplicationContext的尽量使用ApplicationContext(比如Toast)。

7.对于临时的Bitmap对象使用软引用缓存同时注意解释回收。

8.对于只执行一个任务的service使用IntentService(执行完毕会自动停止,感兴趣可看看IntentService源码)。

9.使用新进程执行一些任务,使用AIDL进行进程间通信。

10.懒加载一些数据。
比如一些弹出的布局(Dialog,或者PopupWindow,或者ViewStub中的布局)在使用的时候在初始化,否则用户如果都不会去点开这些东西。

11.onTrimMemory中回收可有可无的对象(防止app在后台被回收)。
比如10中提到的弹出布局。

12.App中的图片尽量使用web格式的。
Android内存优化的个人理解_第1张图片

可以参考: https://blog.csdn.net/m13984458297/article/details/70159464

13.在向后台传输数据时可以压缩传输的数据。
参考: https://blog.csdn.net/kepoon/article/details/7482096
当然一些网络请求框架设置的压缩可能使用方法不一样但原理是一样的。

如有不足之处请大家多多指出,谢谢。

你可能感兴趣的:(Android)