問題タブ [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.

0 投票する
1 に答える
176 参照

android - 送信者を受信イベントから除外する (Greenrobot の Eventbus)

Eventbus に置かれる (1 つのタイプの) オブジェクトの送信者と受信者であるクラスがあります。

イベントの受信から送信者を除外する方法はありますか? 複数の送信者がいて、他の送信者からのみイベントを受信したいのですが、自分自身からのみ受信したいと考えています。

例:

A はバスに RED を置きます。レシーバー C と D はイベント RED を取得します。しかし、A も (カラー イベントに登録されているため) RED になります。これは回避できますか?したがって、この場合 (A は送信者)、A は受信者であってはなりませんか?

ありがとう

0 投票する
4 に答える
676 参照

java - Android アプリでの複雑なマルチスレッドの理解の難しさ

アプリケーションのマルチスレッドを理解するのに大きな問題があり、そのためにバグが見つかりました。私はすべての可能性を考えていることを確認しましたが、それでもさまざまな (時には予期しない) エラーが発生しています。

たぶん、ここにいる誰かが私にアドバイスをくれるでしょう、私が何をすべきか。

私のプロジェクトでは、2 つの外部ライブラリを使用しています。

  • GraphView - グラフ描画用のビューを提供します
  • EventBus - アプリ コンポーネント間の簡単な通信のためのインターフェイスを提供します

アプリに関しては、次のような構造になっています。

アイデアは、ProcessThreadデータを計算し、一定の値のストリームをGraphFragmentthroughtに提供することですEventBus。で必要なものがありGraphFragmentます。SeriesGraphView

に従ってリアルタイムでグラフを更新するには、新しいグラフを作成する必要があるため、次のRunnableように作成しました。

フラグメントのメソッドから開始すると、onResume()すべてが魅力的に機能します。

残念ながら、私が言及したように、私は別のスレッドからの外部データを使用しています。それを取得するには、(ドキュメントGraphFragmentによると)メソッドを使用しています。onEventMainThread()

そして、ここで何をしようとも、データを渡してPlotsRunオブジェクトのグラフを更新することはできません。これまでのところ、私は試しました:

  • using Queue- add value inonEventMainThreadと get in PlotsRun。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メソッドを使用して別のアイデアとして使用したコードです。

残念ながら、どちらも機能していません。

0 投票する
1 に答える
769 参照

android - イベントバス - POJO の登録を解除するには?

Androidライフサイクルから独立したPOJOでEventBusを登録解除する方法と場所を教えてください。(onCreate メソッド、onDestroy メソッドはありません)

前もって感謝します

0 投票する
1 に答える
915 参照

android - IntentService 内の EventBus レスポンス

IntentService クラスの onHandleIntent(Intent inte) を実装するには、「Webservices.Class」という別のクラスに追加された Web サービスを呼び出す必要があり ますすべてのアクティビティ/フラグメントなど、しかし、私が呼び出したintentServiceクラス内で応答を配信していません.誰かがこの状況に遭遇しましたか?

応答を受信するためにonEventMainThread(ResponseEvent event)を使用しました

前もって感謝します。

0 投票する
1 に答える
92 参照

android - 異なるスレッドでの同じメソッドの予期しない動作

私の最初の質問は次のとおりでした: Android GraphView project get freeze with real time updates。これでは、3 つのプロットの UI スレッドで可能な同時実行について質問していました。メモリ割り当てプロットでは、次のようになります。

ここに画像の説明を入力

私はProcessThread主な活動から直接データを受け取り、それをライブラリonEventMainThreadから. 渡されるすべてのデータは、Bluetooth リスニング サービスからデータを収集し、それを処理して意味のある数値を取得します。EventBusGraphFragmentProcessThread

私の考えは、データを生成してに送信するだけのテストスレッドでこれと同じことが起こるかどうかをテストすることでしたonEventMainThread。これもいくつかのエラーを生成するため、別の質問をすることを余儀なくされました: Difficulty in Understanding complex multi threading in Android app . しばらくして、@AsifMujteba から、テスト スレッドが速すぎるという素晴らしい回答を受け取りました。

すべてのタイミングが正しいかどうかを確認するために、主な問題と実際のスレッドに戻ることができたことを知っています。私が言ったように、多くのことが起こっているので、高速であることは問題ではありません (ただし、データが高速に送信されないかどうかをテストするために、これと同じメカニズムを追加しました)。このスレッドの作業を遅くすることについてもっと心配します。

私の現在onEventMainThreadは次のようになります。

残念ながら、最初に戻ったときに問題が再び発生しました。多くのテストの後、データが正しく送信されているように見えると言えます。私は2つのマーカーでそれをチェックしました:

Logcat メッセージが正しく表示されます。残念ながら、送信は私のテストスレッドと同じように見えますが、エラーが表示されます:

さらに、OpenGL ビジュアライゼーションを使用して別のフラグメントをテストしたときにすべてが機能するため、データが常に正しく送信されていると確信しています。

すべてを要約すると、次のようになります。

1 つの (非常に単純な) スレッドからフラグメントに値を送信すると、EventBusすべてがうまく機能しますが、別の (より複雑な) スレッドから送信すると、表示がフリーズし、メモリ割り当てグラフが表示されます。1 つのスレッドが実行されている場合、2 番目のスレッドはコメントアウトされていることに注意してください。

誰かがここで何が問題なのかアドバイスしてもらえますか? または、何をさらに確認する必要がありますか?

編集

シリーズデータの追加に関するすべてをコメントアウトしてLog.d()、エラーが発生しないようにして、もう1つのテストを行いました。興味深いのは、グラフ更新のブロック (またはフリーズ) が UI 自体に影響を与えないため、すべてのボタンなどを押し続けることができることです。

0 投票する
1 に答える
3746 参照

android - 解決に失敗しました: 'de.greenrobot:eventbus:2.4.0'

私は Android Studio を使用していますが、アプリ コンポーネントの gradle ファイルに次を追加しようとすると、次のバナーが表示されます:compile 'de.greenrobot:eventbus:2.4.0'プロジェクトの同期が成功しました。[メッセージ] ビューを開いて、見つかったエラーを確認します。メッセージ ペインには、次のエラー メッセージが表示されます。dependencies

github でEventBusを確認すると、最新バージョンがmaven centralに存在することがわかりました。

Androidスタジオの設定ミスか何かでしょうか?

正常に動作する残りの依存関係は次のとおりです (イベント バスの依存関係なし)。

0 投票する
0 に答える
59 参照

java - Typed クラス (MyClass など) で「.class」を呼び出す。クラス)

GreenRobot のEventBusクラスで関数を使用しようとしています:

これは、次のような通常のクラスで機能します。


MyStringEventここで、単一のオブジェクト (例: ) を保持し、MyIntegerEventジェネリック (例: ) を使用MyEvent<String>するクラスを定義することから離れたいと思いますMyEvent<Integer>。ただし、次のコードは機能しなくなりました。


このユースケースを処理する適切な方法はありますか?

0 投票する
4 に答える
4096 参照

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

追加した

そしてそれは働いているようです。