Android内存优化的个人理解

一 运行前:

1.首先应用的图片应该压缩一下:

个人喜欢使用的压缩网站:TinyPng。

比如原来应用图片有50k的,压缩过后可能只有10k左右,原来图片有8k的压缩过后可能只有1k,这就使图片占用的内  存更少了,应用也就更流畅了。

2.只提供xhdpi与xxhdpi的图片即可:

因为现在的主流手机应该都是这两种分辨率了,因此只提供这两种分辨率的图片也够用了。

3.对于一下可重用的资源:

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

4.对于没有用到及不需要的包尽量不要引用:

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

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

二 运行时优化:

1.首先要处理图片了:

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

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

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进行进程间通信。



希望大家多多指正,谢谢。

你可能感兴趣的:(Android内存优化的个人理解)