4

asyctask のサブクラスを使用して、バックエンド サーバーとサーバー同期を行うアクティビティがあります。

これはネットワーク タスクであり、数秒かかる場合があります。次のシナリオが起こることを恐れています。

アクティビティが開始され、asynctask が実行を開始する必要があるときはいつでも実行されます。onPreexecute() が呼び出され、実行され、終了します。ただし、doInBackground() が呼び出されて実行されますが、メソッドが実行されているときに、ユーザーはホーム ボタンを押して最近のアプリからアプリをスワイプします。(もちろん、これによりアプリが終了し、すべての onDestroy メソッドが生きているアクティビティから呼び出されます..(これについて間違っている場合は訂正してください))。

私の onPostExecute() メソッドでは、データを DB に挿入し、ビューを更新しています。ただし、アプリが「終了」しているため、onPostExecute() メソッドは実行されません。

私の質問は次のとおりです。

  1. ユーザーがホームボタンを押してアプリから出てアプリをスワイプすると、その瞬間に doInBackground が停止しますか? つまり、途中でカットされ、それが何を続けていないのですか?
  2. サーバーから取得して DB 内に配置しようとしていたデータはどうなりますか? doInBackground 内のデータベースにデータを配置することをお勧めしますか?
4

4 に答える 4

3
  1. AsyncTask は、アプリが閉じられて呼び出されても引き続き実行されるバックグラウンド タスクですonDestroy()。問題は、タスクonPostExecute()がバインドされているアクティビティに関連付けられているビューが存在しなくなったため、そのアクティビティに関連付けられたビューをタスクが開始して更新しようとした場合です。これが気になる場合は、呼び出し元のアクティビティでその AsyncTask への参照を保持してから、myAsyncTaskReference メソッドを呼び出します。呼び出しアクティビティの でcancel(true)キャンセルします。onDestroy()

  2. doInBackground()はい、別のスレッドでバックグラウンドで実行され、アプリ アクティビティへの参照を必要としないため、DB 操作をメソッドに入れます。

代わりに、この種のサービスを使用することを検討しましたか? バックグラウンドで単一のタスクを実行するように特別に設計されたサービスのサブクラスであるIntentServiceを強くお勧めします (AsyncTask に似ています)。実装は非常に簡単で、通常はonHandleIntent()、サービスの開始時に呼び出される 1 つのメソッドをオーバーライドするだけです。

すべての DB 操作を処理でき、アクティビティへの参照がないため、#1 で心配していた問題は発生しません。ビューを更新する必要がある場合は、完了後に IntentService にブロードキャストを生成させることができます。Activity はそのブロードキャストに登録し、受信時にそれに応じてビューを更新できます。また、ブロードキャストが送信された後にアクティビティがなくなったとしても、それは問題ではなく、何も失敗しません。

于 2013-10-28T19:39:59.030 に答える
1
  1. ユーザーが「ホーム」を押すと、Activtiy は一時停止しますが、doInBackground は一時停止しませんが、システムがそのように感じたときにシステムによって終了する場合と終了しない場合があります。アクティビティの onPause が呼び出されます。Asynctask doInBackGround は停止しません。システムが App プロセスを強制終了するまで実行され続けます。
  2. はい、DB 操作には時間がかかる場合があります。別のスレッドで実行されるため、doInBackground を配置することをお勧めします。onpre/onpostexcute はメイン スレッドで実行されます。システムがデータベース操作の途中で終了するのではないかと心配している場合は、Transcation を設定し、完了したときにのみ commit を呼び出します。

この投稿をチェックしてください、私はそれをテストしました。

于 2013-10-28T19:29:33.237 に答える
1
  1. いいえ、止まりません。

  2. それをある種のデータストレージに入れてから操作する方が確実に良いです

そのような目的のためにサービスを使用することは常に良いことです. AsyncTasks はここには収まりません。サービスに作業を依頼してから、必要に応じてアクティビティを開始または終了できます。

于 2013-10-28T19:32:37.467 に答える