最近接到一个新活,优化OOM,好吧,万恶的OOM,这个玩意压根就是虚无的,有一些思路正在做,大概从几个方面思考问题。
- 图片的加载以及回收
- 内存泄漏
- Assets 等的内存问题
所以,首先从比较好着手的内存泄漏开刀。内存泄漏,要搞明白一点,啥叫内存泄漏 ????????
DEFINE : 我的理解是内存的回收不及时。说白了就是内存该换不换。这个尤其是在C 中常见哈,就是万恶的指针哈哈哈。。。。。。。。。。。。。
Android内存泄漏常见的点是:
- Handler持有Activity引用
- 单例持有Activity
- Assets 不回收导致内存泄漏
- WebView 使用不当导致内存泄漏
Handler 持有Activity的引用分析
首先这个玩意要分析Activity的源码,Handler作为Message的分发器,与Looper一起,循环分发Message,所以就有非常实际的问题。
Looper是一个单例模式,其在一个进程初始化的时候创建,当Handler post 一个delayed runnable 的时候,如果Runnable 在Activity finish 之前仍然没有执行,就有可能造成Activity的临时泄漏或者泄露。
泄露示意如图:
解决办法:
1.办法很简单,在Actvity onDestroy 的时候 remove the runnable
2.把Handler变成一个静态类,解决办法如下:
static class H extends Handler{
WeakReference<Activity> ref;
public H(WeakReference<Activity> ref){
this.ref = ref;
}
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
if (ref.get()!=null){
// case match
ref.get().doSomething();
}
}
}
未完待续