1

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

4

1 回答 1

2

您可以使用Wea​​kReference来保护您的服务不被泄露。但实际上Handler在您的代码中看起来是多余的。两者onCreateonStartCommand都是从 UI 线程调用的,因此您可以安全地增加您的值counter,而无需额外同步。

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

于 2012-07-15T16:48:09.297 回答