更新到adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur 。
首先在ADT 20 Changes我们可以找到这样一个变化:New Lint Checks:

Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class.

翻译过来就是,Lint会增加一个检查项目即:确保class内部的handler不含有外部类的隐式引用 。


同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。

知道了原因我们在来看解决方法:
1.最不想动代码的同学,可以在Preference搜一下Lint,在Lint Error Checking里搜HandlerLeak,然后选择ignore,然后整个世界清净了。。。。(不推荐)
2.上面的方法虽然简单,但是肯定不好的。。。给这个检查肯定是有用的,那第二种方法,自然就是把Handler定义成static,然后用post方法把Runnable对象传送到主线程:例。

privatestaticHandlerhandler;publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//CreateahandlertoupdatetheUIhandler=newHandler();}voidtest(){handler.post(newMyRunnable());//这样的方法同样可以用SmsPopupActivity.this.runOnUiThread(newMyRunnalble());来替换,效果是一样的。}staticpublicclassMyRunnableimplementsRunnable{@Overridepublicvoidrun(){imageView.setImageBitmap(downloadBitmap);dialog.dismiss();}}


3。看到这种方式可能又有很多人不乐意了,原来我一个handler处理多个消息,多舒服,你现在要我把每个消息都换成对应的Runnable对象发送,多不爽。
那我们可以通过弱引用的方式来做,例子如下示:我们首先定义了一个static的inner Class MyHandler然后让它持有Activity的弱引用。这样lint warning就消失了。

(其实lint上面怎么做,都有提示:If the Handler is using the Looper or MessageQueue of the main thread, you need to fix your Handler declaration, as follows: Declare the Handler as a static class; In the outer class, instantiate a WeakReference to the outer class and pass this object to your Handler when you instantiate the Handler; Make all references to members of the outer class using the WeakReference object.)

对于acitivity,代码就是如下的样子:

staticclassMyHandlerextendsHandler{WeakReference<PopupActivity>mActivity;MyHandler(PopupActivityactivity){mActivity=newWeakReference<PopupActivity>(activity);}@OverridepublicvoidhandleMessage(Messagemsg){PopupActivitytheActivity=mActivity.get();switch(msg.what){case0:theActivity.todo();break;}}};MyHandlerttsHandler=newMyHandler(this);privateCursormCursor;privatevoidtest(){ttsHandler.sendEmptyMessage(0);}privatevoidtodo(){//TODO}


以上就是我的解决方案,如果您有更好的方法,不妨跟贴,让我们都知道。

(转自:http://www.eoeandroid.com/thread-184245-1-1.html?_dsign=4c760882,稍作修改)

更多相关文章

  1. Android对px和dip进行尺寸转换的方法
  2. android 音量调节时,嘟 的 发声位置
  3. Android(安卓)ActivityGroup和TabActiviy的差异性
  4. Android处理时间各种方法汇总
  5. 【Android】GestureDetector 类的手势操作方法含义
  6. android拨打电话崩溃6.0以上实时动态权限申请
  7. Android(安卓)pull解析
  8. Android(安卓)平铺背景图片
  9. Android中解析Json方法

随机推荐

  1. Error:Execution failed for task ':app:
  2. linux下eclipse构建并编译android一个简
  3. 系统屋索引
  4. android中json解析及使用(中)
  5. Android FrameLayout
  6. Android获取RecyclerView滑动距离
  7. Android Handler消息处理机制面试5连问
  8. Android拨打电话权限总结
  9. Android中am命令用法
  10. Android(安卓)AlertDialog 无法弹出输入