ホームページ >Java >&#&チュートリアル >Android の AsyncTask で内部クラス変数アクセスを処理する方法は?
AsyncTask での内部クラス変数の参照
AsyncTask では、AsyncTask のスコープ外で宣言された変数へのスレッドセーフなアクセスを考慮することが重要です。次のシナリオはこの問題を示しています。
Android アプリケーションでは、Unzip クラスは、AsyncTask を拡張する内部クラス Decompress を持つ非アクティビティ クラスです。目的は、AsyncTask を使用してフォルダーを解凍することです。 Decompress コンストラクターはパラメーターを設定し、ProgressDialog を表示します。ただし、外部の Unzip クラスから変数にアクセスするときに問題が発生します。
問題 1: 変数の更新の不一致
Decompress の doInBackground メソッドで更新された unzipDest 変数とインデックス変数がそのまま残ります。 Unzip クラスとそのオブジェクトでは null。これは、AsyncTask 操作が別のスレッドで発生するため、そのスレッドで更新された値をすぐに確認してもメイン スレッドに表示されない可能性があるためです。
解決策: コールバック インターフェイス
これに対処するには、インターフェイスを使用して、変数の更新が発生したときにコールバックを作成できます。 Unzip クラスでインターフェイスを実装し、アクティビティ宣言でそのメソッドをオーバーライドします。 onPostExecute() 内でコールバック メソッドを呼び出し、値にアクセスする前に値が更新されていることを確認します。
問題 2: スレッドの継続性に関する懸念
スレッドが戻ると、別の AsyncTask スレッドは失われます。
解決策: 値保持
いいえ、このシナリオでは値が失われるべきではありません。アクセス時に単に更新されていない可能性があります。これに対処するには、変数を使用する前に null チェックを使用するか、onPostExecute() で変数を必要とする関数を呼び出すことができます。
インターフェイスの例
次のインターフェイスについて考えてみましょう。コールバックの実装例:
public interface AsyncResponse { void processFinish(String output); // Same params as onPostExecute() }
を使用するアクティビティ内AsyncTask:
public class MainActivity implements AsyncResponse{ @Override void processFinish(String output){ // Using same params as onPostExecute() // Receive result fired from async class of onPostExecute(result) method. } }
AsyncTask クラス内:
AsyncResponse delegate=null; @Override protected void onPostExecute(String result) { delegate.processFinish(result); // Call the callback method. }
以上がAndroid の AsyncTask で内部クラス変数アクセスを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。