“This Handler class should be static or leaks might occur”警告去除方法

去除警告的几种方法来源网络,若有疑问,请与本人联系。
出现警告的原因:
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")

如果你想偷懒又觉得警告看着别扭就加入这行代码。个人不建议使用这种方法,因为它并没有解决问题。本人水平有限,文中若有理解错误的地方欢迎纠正。如果你有其它好的方法也可以在下方评论留言。谢谢!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值