web-dev-qa-db-ja.com

OttoやEventBusなどのイベントライブラリを使用して、アクティビティ、フラグメント、バックグラウンドスレッド間の関係を処理することをお勧めします。

ほとんどの場合、ケースを扱うとき

  • バックグラウンド処理を実行するユーザースレッド(AsyncTask
  • 計算結果をActivityまたはFragmentに戻す
  • ActivityまたはFragmentは、ユーザースレッドがバックグラウンド処理を完了する前に再作成される場合があります

これまでのところ、多くの信頼できるソースから、推奨される方法はRetained Fragmentを使用していることがわかります

ソース

時々、イベントバスライブラリは、アクティビティ、フラグメント、およびバックグラウンドスレッド間の関係を処理するのに適していると聞きました。 ( https://github.com/greenrobot/EventBus を参照してください。は、アクティビティ、フラグメント、およびバックグラウンドスレッドで適切に実行されると述べています

本当に人気のあるイベントバスライブラリに出会いました

アクティビティ、フラグメント、およびバックグラウンドスレッド間の関係を処理するようになると、イベントバスのアプローチはRetained Fragmentアプローチとどう違うのだろうかと思いました。

推奨される方法はどれですか?

44
Cheok Yan Cheng

イベントバスとOttoは、主にサードパーティライブラリであるため、Android開発者ガイドによる「推奨される方法」ではありません Ottoはかなり新しいものなので、古いガイドは明らかにそれを使用していません。

私は個人的にオットーが好きです、それは私が使用しているものであり、私はこれまで何の問題もありませんでした。しかし、もちろん、それは私のユースケースに適しているからです。

Otto here の使用例があります。

将来からの編集:イベントバスが必要な場合は、 greenrobot/EventBus はOttoよりも優れています。また、場合によっては、 LiveData<T> は、イベントバスを使用する代わりに完全に十分です(誰にもイベントを発行する代わりに、サブスクライバーにのみ発行します)。

17
EpicPandaForce

アクティビティ、フラグメント、およびバックグラウンドスレッド間の関係を処理するようになると、イベントバスアプローチは保持フラグメントアプローチとどのように違うのだろうと思いました。

推奨される方法はどれですか?

次の2つの概念を誤解していると思います。

1)デバイスを回転させたときにタスクが何度も作成されないようにする

2)スレッドからアクティビティへ、またはサービスからフラグメントへ、または...

フラグメント内にタスクを配置するとき、回転している場合はstartにしたくないだけです。また、結果を取得する必要があります。たとえば、imageViewを更新しますが、imageViewをasynctaskに渡し、imageViewを弱参照として保存し、アクティビティがあった後、imageViewがnullの場合、デバイスを回転させます。破棄し、それを強力な参照として保存すると、アクティビティがリークします。そのため、フラグメント内に配置し、ビューを弱い参照として保存し、アクティビティonCreateがその参照の更新と呼ばれる場合、より良いアイデアがあります。

EventBusとOttoは、コンポーネントまたはスレッド間でメッセージを送信するための非常に優れたライブラリです。これらを使用するか、AndroidインターフェースまたはlocalBroadcastManagerまたはハンドラーの作成などのネイティブソリューションを使用できます。

イベントバスアプローチは、保持フラグメントアプローチとどのように異なりますか?

私はそれらのソースコードを調べていませんが、シングルトンキューオブジェクトを作成し、その中にメッセージを保存し、それをデキューしてリスナーにメッセージを渡すと思います。

3
mmlooloo