android警告 —— This Handler class should be static
更新到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,稍作修改)
更多相关文章
- Android对px和dip进行尺寸转换的方法
- android 音量调节时,嘟 的 发声位置
- Android(安卓)ActivityGroup和TabActiviy的差异性
- Android处理时间各种方法汇总
- 【Android】GestureDetector 类的手势操作方法含义
- android拨打电话崩溃6.0以上实时动态权限申请
- Android(安卓)pull解析
- Android(安卓)平铺背景图片
- Android中解析Json方法