我使用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的这两种方式有什么不同?
答案 0 :(得分:1)
第一个代码示例将成员变量设置为调用Service
的引用(我假设它是此内部类的外部类)。这与删除内部类的static
关键字完全相同,因为现在内部类正在引用Service
类的实例(这是您通常尝试的内容)使用static
关键字时要避免使用。
第二个代码示例使用弱引用,这意味着垃圾收集器可以清理(销毁)Service
类的实例,即使您在Handler中持有对它的引用。如果发生这种情况,对mMyService.get()
的调用将返回null,因此您最好在代码中检查它。
实际上,这两个代码示例之间没有区别,因为Handler
被销毁后您将不会使用Service
。