Android Handler : Handler为什么需要是static的 (二)
2016-09-20 09:40
344 查看
怎么解决由于Handler引起的Memory Leak
既然知道了,Memory Leak的根本原因是Handler持有Context,导致Context无法释放。那么解决的办法就是断开Handler和Context之间的连接,让Handler不再持有Context的引用。大概的方法有:
将隐性匿名类Handler变成static的内部类,由于static的内部类,使用的使用不需要外部类的实例,所以static的内部类和外部类是没有联系的,从而不持有外部类的引用;
将隐性匿名类写成一个单独的类(top-level-class),这样Handler和Context之间就没有联系了。
将Handler做成static 内部类
public class HandlerTestActivity extends Activity { private final TestHandler mHandler = new TestHandler(this); static class TestHandler extends Handler { WeakReference<HandlerTestActivity> mActivity; MyHandler(HandlerTestActivity activity) { mActivity = new WeakReference<HandlerTestActivity>(activity); } @Override public void handleMessage(Message msg) { HandlerTestActivity activity = mActivity.get(); //一定要注意null判断 if(activity != null){ //do something } } }; }
上面代码中,将TestHandler定义成static的内部类,这样断开了Handler和Context之间的联系,从而Handler不再持有Context的实例。
Handler通过弱引用保持Context的实例。弱引用的特点是,当系统GC的时候,是可以自动释放掉的,这样在系统GC的时候,Context也就被释放掉了,不会引起Memory Leak。
Runnable怎么处理
public class HandlerTestActivity extends Activity { private Runnable mRun = new Runnable() { @Override public void run() { // ... do something } } }
由于上面的Runnable也存在Handler的Memory Leak的问题。原因是Runnable持有Context的实例。
所以Runnable的解决办法也是讲Runnable和Context断开连接。将Runnable声明为static的即可。
public class HandlerTestActivity extends Activity { private static Runnable mRun = new Runnable() { @Override public void run() { // ... do something } } }
相关文章推荐
- Android Handler : Handler为什么需要是static的 (一)
- Android解惑之Handler为什么需要是static的
- Android解惑之Handler为什么需要是static的
- This Handler class should be static or leaks might occur Android
- This Handler class should be static or leaks might occur Android
- android之lint警告This Handler class should be static or leaks might occur
- 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法
- This Handler class should be static or leaks might occur Android
- 为什么android中的AlertDialog要用一个内部的static class Builder来创建呢?
- 编译android代码时为什么需要“交叉编译环境”
- This Handler class should be static or leaks might occur Android
- 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- Android开发之Handler需要注意的地方
- android Handler应设为static
- android之lint警告This Handler class should be static or leaks might occur
- 为什么Android系统需要使用C、C++和Java语言共同开发
- Android开发环境为什么需要依赖jvm
- This Handler class should be static or leaks might occur Android (转)
- Android“This Handler class should be static or leaks might occur”警告的处理方法