最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解决办法,但都不够详细,这里我重新写一下这个问题的解决办法。

1.问题原因:在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.” 就是说在ADT20以后加入了一条新的检查规则:确保类内部的handler不含有对外部类的隐式引用 。


2.解决办法:我这里提供三种解决办法推荐第三种。

第一种:(不推荐)根据eclipse的提示,直接加入“@SuppressLint("HandlerLeak")”的注释或者在Window-->Preferences-->Android-->Lint Error Checking里面检索HandlerLeak,然后选择ignore。如下图:


不推荐 这种方法,这种方法实际上没有解决问题。


第二种 :把Handler定义成static,然后用post方法把Runnable对象传送到主线程,代码如下:

        private static Handler handler;private TextView textView;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main); handler = new Handler(); // Create a handler to update the UI}void test() {handler.post(new MyRunnable());}static public class MyRunnable implements Runnable {@Overridepublic void run() {textView.setText(R.string.success);//改变textView显示的内容/*此处放入要改变UI的操作即可*/}}

这种方法将要发送的消息转换成了对应的Runable对象,适用于只有一个消息要发送的情形,如果有多个消息要发送可以采用第三种方法。


第三种 :(推荐)这里我们可以采用弱引用的方式来解决问题,我们先定义一个static的内部类MyHandler,然后让它持有Activity的弱引用,这样问题就得到了解决。代码如下:

static class MyHandler extends Handler {//注意下面的“PopupActivity”类是MyHandler类所在的外部类,即所在的activityWeakReference<PopupActivity> mActivity;MyHandler(PopupActivity activity) {mActivity = new WeakReference<PopupActivity>(activity);}@Overridepublic void handleMessage(Message msg) {PopupActivity theActivity = mActivity.get();switch (msg.what) {//此处可以根据what的值处理多条信息case 0x0001://这里可以改变activity中的UI控件的状态theActivity.textView.setText(R.string.hello_world);break;}case 0x0002://这里可以改变activity中的UI控件的状态theActivity.textView.setText(R.string.welcome);break;/*这里可以有多条要处理信息的操作*//*... ...*/}}};//实例化一个MyHandler对象MyHandler testHandler = new MyHandler(this);private void test1() {//这里发送了一个空消息,空消息的what值是0x0001testHandler.sendEmptyMessage(0x0001);}private void test2() {//这里发送了一个空消息,空消息的what值是0x0001testHandler.sendEmptyMessage(0x0002);}
如果您有更好的解决方案,欢迎留言,参考文献: http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler

更多相关文章

  1. 【android】利用getViewTreeObserver().addOnGlobalLayoutListen
  2. android中context及全局变量小析
  3. Activity的onConfigurationChanged事件
  4. Android(安卓)Handler和内部类的正确用法
  5. Handler消息机制 源码解读
  6. Android开机时桌面Widget的载入流程
  7. 一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推
  8. 轻听变色之谜-如何改变Android应用的主题色
  9. 阿里云消息队列MQTT踩坑之路(阿里云MQTT Android客户端)

随机推荐

  1. 根据css背景图属性+css定位制作雪碧图效
  2. 侧边栏作业
  3. PHP中的extract()函数
  4. 手敲CSS制作太极图
  5. 学习猿地列表标签练习作业
  6. 京东导航变色作业
  7. 数字九宫格作业
  8. PHP中的视图基类的实例演示
  9. css的太极图
  10. 宝塔安装Fastadmin访问后台报404错误