显然Handlers
应该被声明为静态,或者它们可以泄漏它们的外部类(以及应用程序上下文)。这显然限制了你可以用Handler
做什么,我想知道我想做什么实际上是可能的。看看这段代码:
public class MyService extends Service {
private int counter;
private static final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// Increment counter here
}
};
@Override
public void onCreate() {
super.onCreate();
counter = 0;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler.sendEmptyMessage(0);
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
静态处理程序无法保存对服务的引用,因此counter++
内的简单handleMessage()
将无效。有没有办法检查服务是否正在运行并获得对它的引用?
答案 0 :(得分:2)
您可以使用WeakReference来保护您的服务不会泄露。但实际上代码Handler
看起来多余。从UI线程调用onCreate
和onStartCommand
,这样您就可以安全地增加counter
而无需额外同步。
如果您确实需要从不同的主题访问counter
,请使用AtomicInteger代替int
。它比使用Handler
更简单,您将获得更多性能。