0

我用 Handler 制作服务,我需要 Handler 来使用一些服务方法。由于 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的方式有什么区别呢?

4

1 回答 1

1

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

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

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

于 2013-03-11T12:45:48.777 回答