0

Handler で Service を作成していますが、いくつかの Service メソッドを使用するには Handler が必要です。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 を使用するこの 2 つの方法の違いは何ですか?

4

1 に答える 1

1

最初のコード例では、メンバー変数を呼び出し元の参照に設定しますService(これは、この内部クラスの外部クラスであると想定しています)。これは、内部クラスのキーワードを削除した場合とまったく同じです。これはstatic、内部クラスがクラスのインスタンスへの参照を保持しているためです (これは、キーワードServiceを使用するときに通常回避しようとしていることです)。static

2 番目のコード例では弱参照を使用しています。つまり、Serviceハンドラーでクラスへの参照を保持している場合でも、ガベージ コレクターはクラスのインスタンスをクリーンアップ (破棄) できます。その場合、 への呼び出しmMyService.get()は null を返すため、コードでそれを確認することをお勧めします。

実際には、が破棄されると を使用しないため、これら 2 つのコード例に違いはありませんHandlerService

于 2013-03-11T12:45:48.777 に答える