1. ホーム
  2. アンドロイド

[解決済み】バックグラウンドタスク、プログレスダイアログ、オリエンテーションの変更 - 100%動作する解決策はありますか?

2022-04-16 02:49:11

質問

バックグラウンドスレッドでインターネットからデータをダウンロードします。 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 を使用して、作業が完了したかどうかをユーザーに知らせます。 ブログの記事はこちら このパターンについて詳しく説明します。