1

私のアプリにはAsyncTask、サーバーから大量のデータを継承してダウンロードするクラスがあります。ProgressBarダウンロードの進行状況を示すためにを使用しています。

ユーザーがHOMEキーを押すと、ActivityこれAsyncTaskが添付されている が破壊されますが、ダウンロードは続行されます。

AsyncTaskこれを再接続して進行状況をユーザーに表示するにはどうすればよいですか? 使ってみonRetainNonConfigurationInstanceたのですが、Android 4.0ではこのメソッドが呼び出されないようです。Fragments私のアプリケーションはAPIを使用しません。

4

3 に答える 3

4

この状況で私がしたことは次のとおりです。

  1. サーバーとの通信を処理するIntentServiceを作成しました。これには、AsyncTaskの利点(ワーカー スレッドなど) がいくつかありますが、Service の利点もいくつかあります (いつでもどこからでも利用できます)。
  2. IntentService は、メイン アクティビティのユーザー アクションによって、または不正確な繰り返しアラームによって呼び出すことができます。
  3. データは、ContentProviderが前にあるSQLite データベースに格納されます。SQLiteOpenHelperを使用し、バックグラウンドの IntentService の安全性からgetWritableDatabase()を呼び出すことで、データベースとテーブルを作成するタイミングと方法の問題を回避します。
  4. タスクが完了すると、メインのアクティビティがアクティブでない場合に通知が投稿されます。

この配置の良い点の 1 つは、プログレス バーが必要ないことです。実際、UI は必要ありません。ユーザーは、サービスの実行中にアプリケーションを使用し続け、新しいデータが ContentProvider に入ると、UI は自動的に更新されます。もう 1 つの優れた点は、AsyncTask よりも記述するコードが少ないことです。データベースから最後のエントリのサーバー側メタデータを読み取り、その時点から開始するようにユーザーに求めることで、最後に中断したところから自動的に取得します。Activity インスタンスに関連付けられていないため、 onPostExecute()構成の変更などは気にしません。また、AsyncTask のような単発実行について心配する必要はありません。

于 2012-08-04T20:41:27.133 に答える
1

バックグラウンドで大量のデータをダウンロードする必要がある場合は、AsyncTask ではなくサービスを使用します。サービスの使用に関する Google IO からの優れたプレゼンテーションがあります。

AsyncTask ドキュメントからの引用:

スレッドを長時間実行し続ける必要がある場合は、Executor、ThreadPoolExecutor、FutureTask など、java.util.concurrent パッケージで提供されるさまざまな API を使用することを強くお勧めします。

タスクは 1 回だけ実行できます (2 回目の実行を試みると、例外がスローされます)。

私が理解しているように、最後の AsyncTask を続行することはできません。それでも、データを部分的にロードし、読み取ったデータ量を節約してから、最後に保存されたポイントから開始する新しい AsyncTask を開始できます。私の見解では、アクティビティがバックグラウンドに移行したときに読み込みを一時停止するのは最善の方法ではなく、サービスを使用して開始したものを終了する方がよいでしょう。

于 2012-08-04T20:12:42.347 に答える
0

サービスを使用して AsyncTask をアタッチすることを検討しましたか? 永続的に実行されているサービスとして見ることは、おそらくあなたの目の前のタスクにとって最良の解決策でしょう. その後、サービスが実行されているかどうか、およびダウンロードが実行されているかどうかを確認するだけで済みます (静的なブール変数を使用して簡単に実行できます)。次に、サービスの状態保存変数 (おそらくパーセンテージ) を使用して進行状況ダイアログを作成します。ダウンロードしたファイルの合計サイズなど) をメイン アクティビティの onCreate メソッドに記述します。

于 2012-08-04T20:14:58.303 に答える