0

質問:長時間実行タスクからアクティビティへの進行状況/完了を報告するためのベストプラクティスは何ですか?アクティビティがバックグラウンド/オリエンテーションに変化している間に進行状況/完了レポートが発生した場合の対処方法は?アクティビティまたはフラグメントへのコールバックを伴う長時間実行タスク

実生活の例: アクティビティは、サーバーからデータを取得するネットワークコールを行います(これには10 +秒かかる場合があります)。 このネットワークコールが終了すると、アクティビティに通知し、アクティビティでネットワークコールが終了したことを示す必要があります。

これは、アプリが開いたままであれば実装が簡単です。私の問題は、アプリケーションがバックグラウンドにある間にネットワークコールが終了した場合(何らかのコールバックが欠落する)、どうすればよいかです。

私はこれを行うには、次の方法を見てきたが、私は何をすべきかを決定することはできません:ネットワーク呼び出しが実行されるスレッドを生成

  • サービス。サービスはアクティビティにバインドされています。ネットワーク通話終了時に、アクティビティへのサービスコールバック。サービスがコールバックを作成したときにアクティビティがバックグラウンドになっている(アクティビティがコールバックを逃している)場合、アクティビティはサービスに保存されたデータをポーリングする必要がありますか?
  • ネットワーク呼び出しが終了したときにデータをブロードキャストIntentService(それが背景にあるため、活動はこの放送を見逃した場合に何をすべきか?)
  • AsyncTaskが、アクティビティなどを背景に
あるとき、これは悪いです

この問題にはどのようにアプローチすればよいですか?

答えて

0

私はHeadlessFragmentsを呼び出してこの問題を解決しました。 Thisブログ記事では、その実装方法を詳しく説明しています。

EDIT:コメントでの質問について :Activityはバックグラウンドで動作しているときのコールバックが失われている程度

  1. あなたの特定の質問には、答えはノーです。 「背景」とは、Activityがまだ生きていることを意味します。私が投稿したリンクから、Activityであるは、それ自体がActivityから切り離されたとき、すなわちActivitydestroyedのときに削除されます。したがって、Activityがバックグラウンドにあり、destroyedでない場合、それはまだcallbackになり、その中で何をしてもcallbackとなります。 Androidはpausedのアクティビティを殺すことができますが、その場合はActivitydestroyedとなり、callbackは届きません。このような場合、サーバーから取得したデータをSQLiteのように永続的なストレージに保存し、Activitycreatedの場合には別のネットワークコールやネットワークコールを防ぎ、表示するデータを持っています(もちろん、呼び出しは通過します)。

  2. Fragmentの使用は、具体的にはあなたの質問に記載された構成の変更を処理することでした。実行中のタスクは、まだFragmentではなく、AsyncTaskによって実行されています。 Fragmentはオブジェクトへの参照のみを保持します。だから、私はそれが「ベストプラクティス」ではないと主張したいと思う。

+0

ありがとうございました。私は2つの質問があります: アクティビティがバックグラウンドの間にタスクが完了するとどうなりますか?それから、すべてのコールバックが見逃されてしまうでしょう。アクティビティがバックグラウンドの間にサーバーから取得されたデータを取得するにはどうすればよいですか? タスクを実行するためにフラグメントを使用することは「ベストプラクティス」のようには思われません。 私は間違いなくこのアプローチの点を参照してください。 編集:データをHeadlessFragmentに保存し、 "TaskHasFinished"の場合はフラグメントからデータを要求する必要がありますか? –

+0

@JonasJensenあなたの質問については、編集された答えをご覧ください。 – Nerd

関連する問題