如何将静态处理程序与服务/活动一起使用?

时间:2012-07-15 14:59:33

标签: android service

显然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()将无效。有没有办法检查服务是否正在运行并获得对它的引用?

1 个答案:

答案 0 :(得分:2)

您可以使用WeakReference来保护您的服务不会泄露。但实际上代码Handler看起来多余。从UI线程调用onCreateonStartCommand,这样您就可以安全地增加counter而无需额外同步。

如果您确实需要从不同的主题访问counter,请使用AtomicInteger代替int。它比使用Handler更简单,您将获得更多性能。

相关问题