問題タブ [greenrobot-eventbus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 送信者を受信イベントから除外する (Greenrobot の Eventbus)
Eventbus に置かれる (1 つのタイプの) オブジェクトの送信者と受信者であるクラスがあります。
イベントの受信から送信者を除外する方法はありますか? 複数の送信者がいて、他の送信者からのみイベントを受信したいのですが、自分自身からのみ受信したいと考えています。
例:
A はバスに RED を置きます。レシーバー C と D はイベント RED を取得します。しかし、A も (カラー イベントに登録されているため) RED になります。これは回避できますか?したがって、この場合 (A は送信者)、A は受信者であってはなりませんか?
ありがとう
java - Android アプリでの複雑なマルチスレッドの理解の難しさ
アプリケーションのマルチスレッドを理解するのに大きな問題があり、そのためにバグが見つかりました。私はすべての可能性を考えていることを確認しましたが、それでもさまざまな (時には予期しない) エラーが発生しています。
たぶん、ここにいる誰かが私にアドバイスをくれるでしょう、私が何をすべきか。
私のプロジェクトでは、2 つの外部ライブラリを使用しています。
アプリに関しては、次のような構造になっています。
アイデアは、ProcessThread
データを計算し、一定の値のストリームをGraphFragment
throughtに提供することですEventBus
。で必要なものがありGraphFragment
ます。Series
GraphView
例に従ってリアルタイムでグラフを更新するには、新しいグラフを作成する必要があるため、次のRunnable
ように作成しました。
フラグメントのメソッドから開始すると、onResume()
すべてが魅力的に機能します。
残念ながら、私が言及したように、私は別のスレッドからの外部データを使用しています。それを取得するには、(ドキュメントGraphFragment
によると)メソッドを使用しています。onEventMainThread()
そして、ここで何をしようとも、データを渡してPlotsRun
オブジェクトのグラフを更新することはできません。これまでのところ、私は試しました:
- using
Queue
- add value inonEventMainThread
と get inPlotsRun
。runnable は、メソッドがキューを更新できるよりも高速に読み取りを行うことが判明しました。 - さまざまなバッファの作成 - 結果は とまったく同じ
Queue
です。 mSeries1.appendData(new DataPoint(counter, getRandom()), true, 100);
から直接呼び出すonEventMainThread
- ある時点でフリーズします。onEvent()
ランナブル内にメソッドを作成し、そこから呼び出します-UIをmHandler.post()
ブロックしていて、更新がスナップショットのように見えます。synchronized()
ブロックの有無にかかわらず、言及されているすべてを使用します。
私が理解するのが非常に難しいのは、(ある時点で)正しく機能しているこのランナブルです。
公式の Android ブログで述べられているように、非 UI スレッドから UI を更新することはできません。これが、内部で別のスレッドを使用できない理由ですGraphFragment
。しかし、ランナブルをチェックすると、メインスレッド (UI) で実行されています。これが、無限を作成できず、while loop
代わりに呼び出す必要がある理由mHandler.post(this)
です。
それでも、onEventMainThread
メソッドよりも高速である (より頻繁に呼び出される) ため、別のスレッドのように動作します。
からのデータを使用してグラフ (またはどこを見るべきか) を更新できるようにするにはどうすればよいProcessThread
ですか?
EDIT1:
@Matt Wolfe リクエストに答えると、この問題のコードの最も重要な部分であると思われるものを含め、必要なすべての変数がどのように宣言されているかを示しています。これは非常に単純化された例です:
MainActivity
:
GraphFragment
:
この高速読み取りの問題のため、保護のために実行可能な if が追加されています。しかし、常に何かがあるはずなので、ここにあるべきではありません (少なくとも私はそれを期待しています)。
追加するもう1つのこと-単純Log.d
でカウントする変数を内部onEventMainThread
に配置すると、その値が正しく更新および表示されましたが、残念ながらlogcatはメインUIではありません.
EDIT2:
これは主に @MattWolfeコメントへの応答です
mHandler は、GrapgFragment で宣言および作成された単なる変数です。
はい、そうです、私はmHandler.post()
遅滞なく使用しています。多少の遅延を使用して、違いがあるかどうかを確認します。
前に触れていなかったのは、ProcessThread
が他のフラグメントにもデータを提供しているということです。互いに干渉したり、リソースを共有したりしないことを心配しないでください。これが私が使用している理由ですEventBus
。
EDIT3:
GraphFragment
これは、別のスレッドとrunOnMainThread
メソッドを使用して別のアイデアとして使用したコードです。
残念ながら、どちらも機能していません。
android - イベントバス - POJO の登録を解除するには?
Androidライフサイクルから独立したPOJOでEventBusを登録解除する方法と場所を教えてください。(onCreate メソッド、onDestroy メソッドはありません)
前もって感謝します
android - IntentService 内の EventBus レスポンス
IntentService クラスの onHandleIntent(Intent inte) を実装するには、「Webservices.Class」という別のクラスに追加された Web サービスを呼び出す必要があり ます。すべてのアクティビティ/フラグメントなど、しかし、私が呼び出したintentServiceクラス内で応答を配信していません.誰かがこの状況に遭遇しましたか?
応答を受信するためにonEventMainThread(ResponseEvent event)を使用しました
前もって感謝します。
android - 異なるスレッドでの同じメソッドの予期しない動作
私の最初の質問は次のとおりでした: Android GraphView project get freeze with real time updates。これでは、3 つのプロットの UI スレッドで可能な同時実行について質問していました。メモリ割り当てプロットでは、次のようになります。
私はProcessThread
主な活動から直接データを受け取り、それをライブラリonEventMainThread
から. 渡されるすべてのデータは、Bluetooth リスニング サービスからデータを収集し、それを処理して意味のある数値を取得します。EventBus
GraphFragment
ProcessThread
私の考えは、データを生成してに送信するだけのテストスレッドでこれと同じことが起こるかどうかをテストすることでしたonEventMainThread
。これもいくつかのエラーを生成するため、別の質問をすることを余儀なくされました: Difficulty in Understanding complex multi threading in Android app . しばらくして、@AsifMujteba から、テスト スレッドが速すぎるという素晴らしい回答を受け取りました。
すべてのタイミングが正しいかどうかを確認するために、主な問題と実際のスレッドに戻ることができたことを知っています。私が言ったように、多くのことが起こっているので、高速であることは問題ではありません (ただし、データが高速に送信されないかどうかをテストするために、これと同じメカニズムを追加しました)。このスレッドの作業を遅くすることについてもっと心配します。
私の現在onEventMainThread
は次のようになります。
残念ながら、最初に戻ったときに問題が再び発生しました。多くのテストの後、データが正しく送信されているように見えると言えます。私は2つのマーカーでそれをチェックしました:
Logcat メッセージが正しく表示されます。残念ながら、送信は私のテストスレッドと同じように見えますが、エラーが表示されます:
さらに、OpenGL ビジュアライゼーションを使用して別のフラグメントをテストしたときにすべてが機能するため、データが常に正しく送信されていると確信しています。
すべてを要約すると、次のようになります。
1 つの (非常に単純な) スレッドからフラグメントに値を送信すると、EventBus
すべてがうまく機能しますが、別の (より複雑な) スレッドから送信すると、表示がフリーズし、メモリ割り当てグラフが表示されます。1 つのスレッドが実行されている場合、2 番目のスレッドはコメントアウトされていることに注意してください。
誰かがここで何が問題なのかアドバイスしてもらえますか? または、何をさらに確認する必要がありますか?
編集
シリーズデータの追加に関するすべてをコメントアウトしてLog.d()
、エラーが発生しないようにして、もう1つのテストを行いました。興味深いのは、グラフ更新のブロック (またはフリーズ) が UI 自体に影響を与えないため、すべてのボタンなどを押し続けることができることです。
android - 解決に失敗しました: 'de.greenrobot:eventbus:2.4.0'
私は Android Studio を使用していますが、アプリ コンポーネントの gradle ファイルに次を追加しようとすると、次のバナーが表示されます:compile 'de.greenrobot:eventbus:2.4.0'
プロジェクトの同期が成功しました。[メッセージ] ビューを開いて、見つかったエラーを確認します。メッセージ ペインには、次のエラー メッセージが表示されます。dependencies
github でEventBusを確認すると、最新バージョンがmaven centralに存在することがわかりました。
Androidスタジオの設定ミスか何かでしょうか?
正常に動作する残りの依存関係は次のとおりです (イベント バスの依存関係なし)。
java - Typed クラス (MyClass など) で「.class」を呼び出す。クラス)
GreenRobot のEventBus
クラスで関数を使用しようとしています:
これは、次のような通常のクラスで機能します。
MyStringEvent
ここで、単一のオブジェクト (例: ) を保持し、MyIntegerEvent
ジェネリック (例: ) を使用MyEvent<String>
するクラスを定義することから離れたいと思いますMyEvent<Integer>
。ただし、次のコードは機能しなくなりました。
このユースケースを処理する適切な方法はありますか?
android - AndroidAnnotations と EventBus
同じライブラリからの EventBus イベントのサブスクライバーであるライブラリに、注釈付きのアクティビティがあります。これは次のようになりますが、大幅に簡略化されています。
これに従って動作するはずです:
http://timnew.me/blog/2014/09/14/otto-and-android-annotations-compatibility-issue-analysis/
しかし、実際には次のエラーが返されます。
アクティビティを開始できません... de.greenrobot.event.EventBusException: サブスクライバー クラス com.foo.bar.activities.Foo_ には onEvent というパブリック メソッドがありません
EventBus は親クラスを参照していないようです。みんなが話題にしている @Subscribe アノテーションは Guava と Otto だけにあると思いますが、EventBus にはありません。ネット上で AA と Eventbus の互換性の問題について話している人は誰もいないので、何かが欠けているに違いありません。
どうすればこれを機能させることができますか?
イベントバス: 2.4
AA: 3.2
編集:
WonderCsabo の回答の後、EventBus を 3.0 ベータ版 (Subscribe アノテーションを含む) に、AA を 3.3.1 に更新し、問題はなくなりましたが、別の問題があります。
そして、両方の問題があることに気付きました (onEvent の欠落と現在の PostThread は、リリース バージョンの問題のみです。私は、EventBus と AA の推奨される例外と共に ProGuard を使用しています)。
編集2:
追加した
そしてそれは働いているようです。