真是百闻不如一见啊,来到了新地方,才能阅读到不同的代码,学到不同的东西。
当我们的activity里有handler对象时,有时候会因为handler对activity的持有而导致activity无法被回收,引发oom。
这时我们有三种方法可以处理:
1,弱引用,根据java的gc机制,弱引用不会影响系统对该对象的回收。
- class MyHandler extends Handler{
- WeakReference<Activity> mActivity;
- public MyHandler(<span style="font-family: Arial, Helvetica, sans-serif;">Activity</span><span style="font-family: Arial, Helvetica, sans-serif;"> con){</span>
- this.mActivity = new WeakReference<<span style="font-family: Arial, Helvetica, sans-serif;">Activity</span>>(con);
- }
- public void handleMessage(android.os.Message msg) {
- if(msg.what == 1 ){
- Toast.makeText(Activity.this, "toast", 1000).show();
- send();
- }
- };
- }
2.将Handler声明为静态类。
静态类不持有外部类的对象,所以你的Activity可以随意被回收
- static class MyHandler extends Handler{
- public void handleMessage(android.os.Message msg) {
- if(msg.what == 1 ){
- Toast.makeText(HandlerNull.this, "toast", 1000).show();
- send();
- }
- };
- }
3.通过程序逻辑去除引用handler的业务。
如在关闭Activity的时候停掉你的后台线程。线程停掉了,就相当于切断了Handler和外部连接的线,Activity自然会在合适的时候被回收。2如果你的Handler是被delay的Message持有了引用,那么使用相应的Handler的removeCallbacks()方法,把消息对象从消息队列移除就行了。