4

MainActivity には NavigationDrawer があり、各ナビゲーション メニューには新しい Activity の代わりに Fragment が表示されます。

設定フラグメントがあり、ナビゲーション メニューの順序を変更すると、すぐに NavigationDrawerFragment に反映されるはずです。

SettingsFragment にイベントを投稿しましたが、NavigationDrawerFragment には表示されませんでした。

バスを拡張する AndroidBus を作成しました

public class AndroidBus extends Bus {

    private final Handler mainThread = new Handler(Looper.getMainLooper());

    public AndroidBus() {
        super(ThreadEnforcer.ANY);
    }

    @Override
    public void post(final Object event) {
        if (BuildConfig.DEBUG) Ln.d("BUS: SYNC current thread="+Thread.currentThread().getName()+", post=" + event + " bus=" + this);
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mainThread.post(new Runnable() {
                @Override
                public void run() {
                    post(event);
                }
            });
        }
    }

    @Override
    public void register(Object object) {
        super.register(object);
        if (BuildConfig.DEBUG) Ln.d("BUS: SYNC current thread="+Thread.currentThread().getName()+", register=" + object + " bus=" + this);
    }

    @Override
    public void unregister(Object object) {
        super.unregister(object);
        if (BuildConfig.DEBUG) Ln.d("BUS: SYNC current thread="+Thread.currentThread().getName()+", unregister=" + object + " bus=" + this);
    }
}

Dagger によって各フラグメントにバス オブジェクトを挿入し、onActivityCreated にフラグメントを登録し、onDestroyView の登録を解除します。

イベントを投稿しても配信されず、DeadEvent ログが表示されます。

08-07 11:00:27.203    3519-3519/com.test.app.debug D//AndroidBus.java:40﹕ main BUS: SYNC current thread=main, register=com.test.app.ui.MainActivity@536fa3b0 bus=[Bus "default"]

08-07 11:00:27.231    3519-3519/com.test.app.debug D//AndroidBus.java:40﹕ main BUS: SYNC current thread=main, register=NavigationDrawerFragment{536b79a4 #0 id=0x7f0a0072} bus=[Bus "default"]

08-07 11:00:27.247    3519-3519/com.test.app.debug D//MainActivity.java:127﹕ main SYNC: register: bus=[Bus "default"]
08-07 11:00:27.251    3519-3519/com.test.app.debug D//AndroidBus.java:40﹕ main BUS: SYNC current thread=main, register=SettingsFragment{536b7a2c #1 id=0x7f0a0071} bus=[Bus "default"]


08-07 11:00:31.415    3519-3519/com.test.app.debug D//AndroidBus.java:24﹕ main BUS: SYNC current thread=main, post=com.test.app.events.SettingsUpdatedEvent@536d1aa4 bus=[Bus "default"]
08-07 11:00:31.415    3519-3519/com.test.app.debug D//AndroidBus.java:24﹕ main BUS: SYNC current thread=main, post=com.squareup.otto.DeadEvent@5352027c bus=[Bus "default"]

MainActivity を onCreate メソッドにも登録します。 MainActivity で同じイベントをサブスクライブすると、イベントを受け取ります。

これを読んでくれてありがとう。誰かがこれについて私に教えてくれることを願っています。

4

3 に答える 3

12

私はこの問題を再検討し、自分の愚かさを発見しました。その理由は、別の@Subscribe注釈を使用したためです。OttoGuavaライブラリの両方を使用すると発生する可能性があります。したがって、Android アプリで両方のライブラリを使用する場合は、この点に注意してください。

-import com.google.common.eventbus.Subscribe;
+import com.squareup.otto.Subscribe;
于 2014-09-01T01:26:21.037 に答える
2

また、 orでメソッドを宣言できないことを会話に追加したいと思います。それらは呼び出されません。@Subscribeinterfacesuper class

Ottoドキュメントから:

登録すると、直接のクラス タイプのメソッドのみが検索されます。Guava イベント バスとは異なり、Otto はクラス階層を走査せず、アノテーションが付けられた基本クラスまたはインターフェイスからメソッドを追加しません。これは、ライブラリのパフォーマンスを向上させ、コードを単純かつ明確に保つための明示的な設計上の決定です。

EventBusgreenrobot はこの機能をサポートしています: https://github.com/greenrobot/EventBus

于 2016-08-23T00:42:45.307 に答える