ほとんどの場合、ケースを扱うとき
AsyncTask
)Activity
またはFragment
に戻すActivity
またはFragment
は、ユーザースレッドがバックグラウンド処理を完了する前に再作成される場合がありますこれまでのところ、多くの信頼できるソースから、推奨される方法はRetained Fragmentを使用していることがわかります
時々、イベントバスライブラリは、アクティビティ、フラグメント、およびバックグラウンドスレッド間の関係を処理するのに適していると聞きました。 ( https://github.com/greenrobot/EventBus を参照してください。は、アクティビティ、フラグメント、およびバックグラウンドスレッドで適切に実行されると述べています)
本当に人気のあるイベントバスライブラリに出会いました
アクティビティ、フラグメント、およびバックグラウンドスレッド間の関係を処理するようになると、イベントバスのアプローチはRetained Fragmentアプローチとどう違うのだろうかと思いました。
推奨される方法はどれですか?
イベントバスとOttoは、主にサードパーティライブラリであるため、Android開発者ガイドによる「推奨される方法」ではありません Ottoはかなり新しいものなので、古いガイドは明らかにそれを使用していません。
私は個人的にオットーが好きです、それは私が使用しているものであり、私はこれまで何の問題もありませんでした。しかし、もちろん、それは私のユースケースに適しているからです。
Otto here の使用例があります。
将来からの編集:イベントバスが必要な場合は、 greenrobot/EventBus
はOttoよりも優れています。また、場合によっては、 LiveData<T>
は、イベントバスを使用する代わりに完全に十分です(誰にもイベントを発行する代わりに、サブスクライバーにのみ発行します)。
アクティビティ、フラグメント、およびバックグラウンドスレッド間の関係を処理するようになると、イベントバスアプローチは保持フラグメントアプローチとどのように違うのだろうと思いました。
推奨される方法はどれですか?
次の2つの概念を誤解していると思います。
1)デバイスを回転させたときにタスクが何度も作成されないようにする
2)スレッドからアクティビティへ、またはサービスからフラグメントへ、または...
フラグメント内にタスクを配置するとき、回転している場合はstartにしたくないだけです。また、結果を取得する必要があります。たとえば、imageViewを更新しますが、imageViewをasynctaskに渡し、imageViewを弱参照として保存し、アクティビティがあった後、imageViewがnullの場合、デバイスを回転させます。破棄し、それを強力な参照として保存すると、アクティビティがリークします。そのため、フラグメント内に配置し、ビューを弱い参照として保存し、アクティビティonCreateがその参照の更新と呼ばれる場合、より良いアイデアがあります。
EventBusとOttoは、コンポーネントまたはスレッド間でメッセージを送信するための非常に優れたライブラリです。これらを使用するか、AndroidインターフェースまたはlocalBroadcastManagerまたはハンドラーの作成などのネイティブソリューションを使用できます。
イベントバスアプローチは、保持フラグメントアプローチとどのように異なりますか?
私はそれらのソースコードを調べていませんが、シングルトンキューオブジェクトを作成し、その中にメッセージを保存し、それをデキューしてリスナーにメッセージを渡すと思います。