AsyncTask
複雑なタスクを別のスレッドで実行するのに最適です。
しかし、 の実行中に方向の変更や別の構成の変更があった場合AsyncTask
、現在の はActivity
破棄され、再起動されます。 のインスタンスはAsyncTask
そのアクティビティに接続されているため、失敗し、「強制終了」メッセージ ウィンドウが表示されます。
そこで、これらのエラーを回避し、AsyncTask が失敗しないようにするための何らかの「ベスト プラクティス」を探しています。
これまでに見たものは次のとおりです。
- 向きの変更を無効にします。(これは絶対に処理すべき方法ではありません。)
- タスクを存続させ、新しいアクティビティインスタンスで更新する
onRetainNonConfigurationInstance
- が破棄されたときにタスクをキャンセルし
Activity
、がActivity
再度作成されたときにタスクを再開するだけです。 - アクティビティ インスタンスではなく、アプリケーション クラスにタスクをバインドします。
- 「shelves」プロジェクトで使用されるいくつかのメソッド (onRestoreInstanceState 経由)
いくつかのコード例:
画面回転中の Android AsyncTasks、パート IそしてパートII
問題を最もうまく解決し、実装も簡単な最善のアプローチを見つけるのを手伝ってもらえますか? これを正しく解決する方法がわからないため、コード自体も重要です。
ベストアンサー1
するないこの問題に対処するために使用しますandroid:configChanges
。これは非常に悪い習慣です。
するないどちらかを使用してください。これはモジュール性が低く、ベースのアプリケーションActivity#onRetainNonConfigurationInstance()
には適していません。Fragment
あなたはできる私の記事を読んでください保持された を使用した構成変更の処理方法を説明しますFragment
。これは、ローテーション変更にわたって を保持するという問題をうまく解決します。基本的には、内で をホストし、を呼び出し、保持されたを介して の進行状況/結果をに報告するAsyncTask
必要があります。AsyncTask
Fragment
setRetainInstance(true)
Fragment
AsyncTask
Activity
Fragment