Android Handler WeakReference 处理

在Android开发过程中使用Handler 经常会看到如下提示:

”This Handler class should be static or leaks might occur“

这个警告是什么意思呢??

同一个线程中的Handler对象共享同一个用于读写消息的Looper对象,由于message 包含目标Handler,只要该message 一直在消息队列,目标Handler就无法被GC回收。

如果Handler不是静态对象,包含该Handler的activity 或者service 即使被结束,仍然无法被回收(garbage collected)。

如果message一直在消息队列中,这种情况有可能会导致内存泄露(memory leaks)。

这种情况什么时候回出现呢?例如在你post一个长时间delay 的message,这样就有可能会出现service已经结束,但是message还在队列中。

因此,我们可以采用静态类和弱引用的方法来处理这个问题。例子参考如下:

static class IncomingHandler extends Handler {
    private final WeakReference<UDPListenerService> mService; 

    IncomingHandler(UDPListenerService service) {
        mService = new WeakReference<UDPListenerService>(service);
    }
    @Override
    public void handleMessage(Message msg)
    {
         UDPListenerService service = mService.get();
         if (service != null) {
              service.handleMessage(msg);
         }
    }
}

public class MyGridFragment extends Fragment{

    static class MyInnerHandler extends Handler{
        WeakReference<MyGridFragment> mFrag;

        MyInnerHandler(MyGridFragment aFragment) {
            mFrag = new WeakReference<MyGridFragment>(aFragment);
        }

        @Override
        public void handleMessage(Message message) {
            MyGridFragment theFrag = mFrag.get();
            switch (message.what) {
            case 2:
                ArrayList<HashMap<String,String>> theurls = (ArrayList<HashMap<String,String>>) message.obj;
                theFrag.urls.addAll(theurls);
                theFrag.theimageAdapter.notifyDataSetChanged();
                theFrag.dismissBusyDialog();
                break;
            }//end switch
        }
    }
    MyInnerHandler myHandler = new MyInnerHandler(this);
}


参考地址:This Handler class should be static or leaks might occur: IncomingHandler

     Handlers and memory leaks in Android

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值