ホームページ > Java > &#&チュートリアル > 内部クラス AsyncTask のデータ変更が外部クラスに反映されないのはなぜですか?

内部クラス AsyncTask のデータ変更が外部クラスに反映されないのはなぜですか?

Susan Sarandon
リリース: 2024-12-13 21:21:12
オリジナル
853 人が閲覧しました

Why Are My Inner Class AsyncTask's Data Changes Not Reflected in the Outer Class?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート