/**这里会报警告:
* 关于Android“This Handler class should be static or leaks might occur”警告的处理方法
* 出现警告的原因?
* ADT20以后加入了一条新的检查规则:确保类内部的handler不含有对外部类的隐式引用
* 为什么Handle要定义成静态的?
* static class 就是为了断开MyHandler 和外部class的联系,
* 让内部类和外部类不产生任何联系就是static class的目的,防止GC时因为handle有引用导致, activity不能被回收,循环泄漏
* 第一种解决方案: @SuppressLint("HandlerLeak")加入注释(不推荐)
* 第二种解决方案:把Handler定义成static,然后用post方法把Runnable对象传送到主线程
* private static Handler handler;handle.post();适用于只有一个消息要发送的情形,如果有多个消息要发送可以采用第三种方法
* 第三种解决方案(推荐)这里我们可以采用弱引用的方式来解决问题,我们先定义一个static的内部类MyHandler,然后让它持有Activity的弱引用,这样问题就得到了解决
* 你需要修复您的处理程序声明如下:声明的处理程序作为一个静态类;
* 在外部类中,实例化一个WeakReference类的外把这个对象处理程序当你实例化处理;
* 使所有引用成员外部类使用WeakReference对象。
*/
MyHandler handler = new MyHandler(this);
static class MyHandler extends Handler{
//注意下面的“”类是MyHandler类所在的外部类,即所在的activity或者fragment
WeakReference<MilkListFragment> mFragment;
MyHandler(MilkListFragment fragment) { mFragment = new WeakReference<MilkListFragment>(fragment);
}
@Override
public void handleMessage(Message msg) {
MilkListFragment fragment=mFragment.get();
super.handleMessage(msg);
switch (msg.what){
case 1:
//这里可以改变activity或者fragment中的UI控件的状态
fragment.adapter.notifyDataSetChanged();
fragment.mListView.onRefreshComplete();
break;
case 2:
//这里可以改变activity或者fragment中的UI控件的状态
fragment.mListView.onRefreshComplete();
break;
}
}
}
关于Android“This Handler class should be static or leaks might occur”警告的处理方法
最新推荐文章于 2023-02-02 17:26:54 发布