去除警告的几种方法来源网络,若有疑问,请与本人联系。
出现警告的原因:
AndroidStudio有一条检查规则,确保类内部的handler不含有对外部类的隐式引用。 去除警告的方法:
Handler 类应该应该为static类型,否则有可能造成泄露。如果Handler是个内部类,那么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。 一、在onCreate()方法外部创建Handler,在子线程中发送消息:
//onCreate()方法外部声明并创建Handler
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
//收到消息后执行
Toast.makeText(this, "去做想做的事", Toast.LENGTH_SHORT).show();
return false;
}
});
//子线程中发送消息
Toast.makeText(mActivity, "支付宝到账100万元", Toast.LENGTH_SHORT).show();
Message msg = new Message();
mHandler.sendMessage(msg);
二、声明为静态 static Handler:
/声明为静态
private static Handler mHandler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建一个静态Handler对象
mHandler = new Handler();
}
//子线程发送消息
Toast.makeText(mActivity, "支付宝到账100万元", Toast.LENGTH_SHORT).show();
mHandler.post(new MyRunnable());
static public class MyRunnable implements Runnable {
@Override
public void run() {
//这里是主线程可以改变UI
Toast.makeText(mActivity, "去做想做的事", Toast.LENGTH_SHORT).show();
}
}
三、弱引用:
//实例化一个MyHandler对象
MyHandler myHandler = new MyHandler(this);
//子线程中发送消息,可以多条
Toast.makeText(mActivity, "支付宝到账100万元", Toast.LENGTH_SHORT).show();
myHandler.sendEmptyMessage(1);
static class MyHandler extends Handler {
//注意下面的“MainActivity”类是MyHandler类所在的外部类,即所在的activity
WeakReference<MainActivity> mActivity;
MyHandler(MainActivity activity) {
mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity mainActivity = mActivity.get();
switch (msg.what) {
//此处可以根据what的值处理多条信息
case 1:
//这里是主线程可以改变UI
Toast.makeText(mActivity, "去做想做的事", Toast.LENGTH_SHORT).show();
break;
}
}
}
四、压制警告(不推荐):
@SuppressLint("HandlerLeak")
如果你想偷懒又觉得警告看着别扭就加入这行代码。个人不建议使用这种方法,因为它并没有解决问题。本人水平有限,文中若有理解错误的地方欢迎纠正。如果你有其它好的方法也可以在下方评论留言。谢谢!