Handler实现与WeakReference有什么区别,没有它?

时间:2013-03-11 10:01:08

标签: android

我使用Handler进行Service,我需要Handler来使用一些Service方法。由于Handler必须为static,因此我可以访问Handler中没有Service引用的Service方法。

所以我这样做了:

private static class ServiceHandler extends Handler {
    MyService service;

    public ServiceHandler(MyService service) {
        this.service = service;
    }

    @Override
    public void handleMessage(Message msg) {
        ...
    }
}

但也发现这是正确的工作方式:

private static class ServiceHandler extends Handler {
    private final WeakReference<MyService> mMyService;

    public ServiceHandler(MyService service) {
        mMyService = new WeakReference<MyService>(service);
    }

    @Override
    public void handleMessage(Message msg) {
        MyService service = mMyService.get();
        ...
    }
}

在Handler中使用Service的这两种方式有什么不同?

1 个答案:

答案 0 :(得分:1)

第一个代码示例将成员变量设置为调用Service的引用(我假设它是此内部类的外部类)。这与删除内部类的static关键字完全相同,因为现在内部类正在引用Service类的实例(这是您通常尝试的内容)使用static关键字时要避免使用。

第二个代码示例使用弱引用,这意味着垃圾收集器可以清理(销毁)Service类的实例,即使您在Handler中持有对它的引用。如果发生这种情况,对mMyService.get()的调用将返回null,因此您最好在代码中检查它。

实际上,这两个代码示例之间没有区别,因为Handler被销毁后您将不会使用Service