ホームページ >Java >&#&チュートリアル >Android の AsyncTask で内部クラス変数アクセスを処理する方法は?

Android の AsyncTask で内部クラス変数アクセスを処理する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-22 15:18:11823ブラウズ

How to Handle Inner Class Variable Access in Android's 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。