[解決済み】バックグラウンドタスク、プログレスダイアログ、オリエンテーションの変更 - 100%動作する解決策はありますか?
質問
バックグラウンドスレッドでインターネットからデータをダウンロードします。
AsyncTask
ダウンロード中はプログレスダイアログが表示されます。方向が変わり、Activityが再起動され、そして私のAsyncTaskが完了します - 私はプログレスダイアログを解除して新しいActivityを開始したいです。しかし、dissueDialogを呼び出すと、時々例外がスローされます(おそらく、Activityが破壊され、新しいActivityがまだ開始されていないためです)。
この種の問題(ユーザーが方向を変えても動作するバックグラウンドスレッドからのUI更新)に対処する最善の方法は何でしょうか?Googleの誰かが何らかの公式な解決策を提供したのでしょうか?
解決方法は?
ステップ1:
AsyncTask
a
static
ネストされたクラス、あるいはまったく別のクラスですが、内部 (非静的ネスト) のクラスではありません。
ステップ2:
AsyncTask
を保持します。
Activity
コンストラクタとセッターで設定されます。
ステップ3:
AsyncTask
を指定し、現在の
Activity
をコンストラクタに渡す。
ステップ4:
onRetainNonConfigurationInstance()
を返します。
AsyncTask
を、元のアクティビティから切り離した後、現在進行中のアクティビティから切り離します。
ステップ#5: In
onCreate()
の場合は
getLastNonConfigurationInstance()
は
null
にキャストしてください。
AsyncTask
クラスを作成し、セッターを呼び出して、新しいアクティビティをタスクと関連付けます。
ステップ6: アクティビティデータメンバーを
doInBackground()
.
上記の作り方に従えば、すべてうまくいきます。
onProgressUpdate()
と
onPostExecute()
の開始と終了の間に中断されます。
onRetainNonConfigurationInstance()
と、その後に続く
onCreate()
.
以下はサンプルプロジェクトです。 のデモを行います。
別のアプローチとして
AsyncTask
に移動させ
IntentService
. これは、行うべき作業が長くなる可能性があり、ユーザーのアクティビティに関係なく続ける必要がある場合に特に有効です(例:大きなファイルをダウンロードする場合など)。あなたは、順序付きブロードキャスト
Intent
を使用して、アクティビティに実行中の作業に応答させるか (それがまだフォアグラウンドにある場合)、または
Notification
を使用して、作業が完了したかどうかをユーザーに知らせます。
ブログの記事はこちら
このパターンについて詳しく説明します。
関連
-
[解決済み】Android TextView : "setTextで表示されたテキストを連結しない" について
-
[解決済み】Android Studioでパラメータ化されたユニットテストを実行すると、指定されたインクルードに対するテストが見つからないエラーが発生する
-
[解決済み】シンボル 'AppCompatActivity' を解決できない。
-
[解決済み] ユーザーが拒否する可能性のあるパーミッションが必要なコール
-
[解決済み】IllegalStateException: ViewPager で onSaveInstanceState の後にこのアクションを実行できません。
-
[解決済み] Looper.prepare()を呼び出していないスレッドではハンドラを作成できない
-
[解決済み] Xlint:deprecationを使用して再コンパイルする方法
-
[解決済み] Android Fragment no view found for ID?
-
[解決済み】プログレスダイアログとバックグラウンドスレッドがアクティブなときに、画面の向きが変わるのをどう処理するか?
-
[解決済み] ベストプラクティスです。方向転換中のAsyncTask
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンテンツには、id属性が「android.R.id.list」であるListViewが必要です。
-
[解決済み】java.lang.RuntimeException: アクティビティを開始できない ComponentInfo
-
[解決済み】ビューのルートとしてNULLを渡さないようにする(膨張したレイアウトのルート要素でレイアウトパラメータを解決する必要がある)。
-
[解決済み】Android Studio 3.2 - com.android.tools.build:aapt2:3.2.0-4818971 を見つけられませんでした。
-
[解決済み] Looper.prepare()を呼び出していないスレッドではハンドラを作成できない
-
[解決済み] sendUserActionEvent() は null です。
-
[解決済み] Xlint:deprecationを使用して再コンパイルする方法
-
[解決済み] AndroidでBluetoothが有効かどうかのチェックに失敗する(REQUEST_ENABLE_BTを変数に解決できない)。
-
[解決済み] Androidで画面が回転しないようにする
-
[解決済み】AsyncTaskは本当に概念的に欠陥があるのか、それとも私が何かを見逃しているだけなのか?