2

バックグラウンド処理を実行するフラグメントのホスティング アクティビティに通知するための推奨されるアプローチは何ですか。フラグメントが、メイン ルーパーの外部で作業を実行しているいくつかのスレッドを実行していると仮定します。

次の理由から、単純なコールバックは機能しません。

  • NullPointerException につながる画面の回転が原因で、Activity がデタッチされる可能性がありました。
  • アクティビティ内からのポーリングはばかげています
  • アタッチされている場合はアクティビティを 1 回だけ呼び出し、各 onCreate 呼び出しの後にアクティビティをチェックさせます (つまり、画面の回転による)。
  • 私が現在行っていることですが、間違っているようです: Fragment がアタッチされるたびに、作業が完了したかどうかを確認し、コールバックを介してアクティビティに通知します。フラグメントが作業を終了すると、アクティビティもコールバックします (アタッチされている場合)。

なぜ私はそれが間違っていると思うのですか?フラグメントがアタッチされているかどうか、およびコールバックを呼び出すために作業が完了しているかどうかをチェックするいくつかの本当にいメソッドがあるためです。これは、フラグメントで何らかの作業を実行しているときに例外が発生し、アクティビティが分離されると、非常に愚かになります。Android が同時に onSaveInstance を呼び出すことを決定した場合、例外をバンドルに入れ、後でアクティビティとフラグメントが保存された状態から再作成されたときにそれを配信する必要があります。さらに、アクティビティが同じコールバックを 2 回受信する状況に遭遇する可能性があります (1 回目はフラグメントのチェックから、2 回目はフラグメントがアタッチされたときです。これは、アプリケーションが保存されて復元されたときに発生する可能性があります)。

これにより非常に多くのコードが生成されるため、私の意見では、アクティビティが切り離されなければ、より明確になる可能性があります。だからこそ、私は何か間違ったことをしていて、誰かが私にもっと良い解決策を提供してくれることを願っています.

4

1 に答える 1

2

バックグラウンド処理にはサービスを使用する必要があると思いますが、特定の理由でフラグメントを選択した場合は、それを使用できます。アクティビティとはライフサイクルが異なるフラグメントまたはサービスからアクティビティに通知する方法は、BroadcastReceiverを使用することです。このメソッドを使用すると、アクティビティは自身のライフサイクル コールバック中に BroadcastReceiverを登録および登録解除できます。フラグメントまたはサービスからブロードキャストを送信するだけで、それを忘れることができます。アクティビティがブロードキャストをリッスンしている場合は受信しますが、そうでない場合は何も起こりません。

于 2013-05-28T20:28:58.390 に答える