AsyncTask の内部クラス データ変更
このシナリオでは、AsyncTask を拡張し、メンバーの変更を試みる内部クラス Decompress があります。それを囲んでいるクラス Unzip の変数。ただし、これらの変更は、外部クラスからアクセスすると失われるようです。
データ更新
この問題は、AsyncTask が非同期で動作する、つまり で実行されるという事実に起因します。別のスレッド。メンバー変数への変更はクラス内に残りますが、スレッドの分離により、それを囲んでいるクラスにすぐには反映されない場合があります。外部クラスが更新された値に確実にアクセスできるようにするために、コールバック メカニズムを実装できます。
Callback Interface
1 つの解決策は、次のようなメソッドを備えたインターフェイスを作成することです。内部クラスがタスクを完了し、値を更新したときに呼び戻されます。この例では、次のようなインターフェイスを定義できます。
public interface InnerClassUpdateListener { void onInnerClassUpdate(String index, String unzipDest); }
Implementation
Decompress クラスで、AsyncTask 内に onInnerClassUpdate メソッドを実装します。このメソッドは、内部クラスがタスクを完了し、値が更新されたときに呼び出されます。 doInBackground メソッドにコードを追加します。
if (unzip operation is successful) { result = true; index = url pointing to location of unzipped folder; unzipDest = something; //unzip destination is set here if (callback != null) { callback.onInnerClassUpdate(index, unzipDest); } }
Unzip クラスで、コールバックのリスナーとして登録します。例:
Decompress decompress = new Decompress(location, activity); decompress.setCallback(new InnerClassUpdateListener(){ @Override public void onInnerClassUpdate(String index, String unzipDest) { // Update your outer class variables here } });
スレッドの考慮事項
正しく指摘したように、AsyncTask は別のスレッドで実行されます。これは、このスレッドで更新された値はすべて、タスクが完了するまでそのスレッド内に残ることを意味します。ただし、タスクが完了し、onPostExecute メソッドが呼び出されると、更新された値が周囲のクラスで使用できるようになります。コールバックを実装すると、更新された値が利用可能になったときに外部クラスが確実にアクセスできるようになります。
以上が内部クラス AsyncTask のデータ変更が外部クラスに反映されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。