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

WeakReferenceを使用して、サービスのリークを防ぐことができます。しかし、実際にHandlerはあなたのコードでは冗長に見えます。onCreateとは両方ともUIスレッドから呼び出されるため、追加の同期なしでonStartCommand安全に増やすことができます。counter

counter本当に異なるスレッドからアクセスする必要がある場合は、代わりにAtomicIntegerintを使用してください。使用するよりも簡単で、Handlerパフォーマンスが向上します。

于 2012-07-15T16:48:09.297 に答える