3

@ContextSingletonコンテキストへの注入に依存するシングルトンをマークするために使用しています。Applicationしかし、RoboGuice のソースと私自身のテストを見ると、コンテキストと異なるアクティビティ コンテキストとの間に違いがあるように見えます。これは完全に理にかなっていますが、少なくとも私にとっては、次のようなイベント管理機能と一緒に使用すると問題が発生するということだけです。

@ContextSingleton
public class Service {
    @Inject
    private Context context;

    public void doSomething(@Observes MyEvent ev) {
        ...
    }
}

サービスはシングルトンとして定義されていますが、明らかに遅延読み込みによって最初にどこかに注入されるまで、そのインスタンスは作成されないようです。したがって、 aMyEventを起動しても、リスナーは呼び出されません。次に、アプリケーションで事前にクラスを「手動で」eager-load できると考えました。

RoboGuice.get(context).getInstance(Service.class);

したがって、リスナーを登録しますが、これは後でイベントを発生させるために を注入したアクティビティ内でEventManager実行された場合にのみ適切に機能しましたが、アプリケーションでは機能しませんでした。

したがって、理想的な世界では、次のように、シングルトンをどのコンテキストにバインドする必要があるかを RoboGuice に伝えることができると期待しています。

@ContextSingleton(MyApplication.class)
public class Service {
    ...
}

しかし、明らかにこれは不可能です。

私は何が欠けていますか?

4

2 に答える 2

2

イベントがコンテキスト全体に伝播せず、コンテキスト固有であることを見逃していると思います-(古いが、まだ有効な)イベントのドキュメントの「注意事項」セクションを参照してください。そのため、シングルトンがアプリケーション コンテキストに読み込まれたとしても、各アクティビティのコンテキスト内で発生するイベントを認識することはできません。そのようにするのには十分な理由があったと思いますが、サブクラス化すると、グローバルにアクセスできるようにそこに Application注入できるかもしれません。EventManager

私はそれを試していないので、それが機能するかどうかはわかりません.とにかく、その時点で別のEventManagerにイベントを注入する必要があるため、このシングルトンのインターフェースを定義して機能させる方がよいかもしれません.イベントは希望どおりに伝播しないためです。

于 2012-09-25T22:13:45.457 に答える