您的位置:首页 > 移动开发 > Android开发

Android“This Handler class should be static or leaks might occur”警告的处理方法

2014-03-06 22:33 537 查看
此文属于转载!

最近用到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对象传送到主线程,代码如下:

[java] view plaincopy

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 {

@Override

public void run() {

textView.setText(R.string.success);//改变textView显示的内容

/*此处放入要改变UI的操作即可*/

}

}

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

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

[java] view plaincopy

static class MyHandler extends Handler {

//注意下面的“PopupActivity”类是MyHandler类所在的外部类,即所在的activity

WeakReference<PopupActivity> mActivity;

MyHandler(PopupActivity activity) {

mActivity = new WeakReference<PopupActivity>(activity);

}

@Override

public 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值是0x0001

testHandler.sendEmptyMessage(0x0001);

}

private void test2() {

//这里发送了一个空消息,空消息的what值是0x0001

testHandler.sendEmptyMessage(0x0002);

}

如果您有更好的解决方案,欢迎留言,参考文献:http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐