首頁 > Java > java教程 > Android的AsyncTask如何處理內部類別變數存取?

Android的AsyncTask如何處理內部類別變數存取?

Mary-Kate Olsen
發布: 2024-12-22 15:18:11
原創
867 人瀏覽過

How to Handle Inner Class Variable Access in Android's AsyncTask?

AsyncTask 中的內部類別變數引用

在AsyncTask 中,考慮在AsyncTask 範圍之外宣告的變數的執行緒安全存取至關重要。以下場景說明了這個問題:

在 Android 應用程式中,Unzip 類別是一個非 Activity 類,具有擴展 AsyncTask 的內部類 Decompress。目的是使用 AsyncTask 解壓縮資料夾。 Decompress 建構子設定參數並顯示 ProgressDialog。但是,從外部 Unzip 類別存取變數時會出現問題。

問題 1:變數更新差異

在 Decompress 的 doInBackground 方法中更新的 unzipDest 和索引變數仍然存在Unzip 類別及其物件中為 null。這是因為 AsyncTask 操作發生在單獨的執行緒中,因此在該執行緒中更新的值在立即檢查時可能在主執行緒中不可見。

解決方案:回呼介面

為了解決這個問題,您可以使用一個介面在變數更新發生時建立回調。在 Unzip 類別中,實作介面並重寫 Activity 聲明中的方法。在 onPostExecute() 中,呼叫回呼方法以確保在存取值之前更新值。

問題 2:執行緒連續性問題

您可能想知道值是否在當執行緒返回時,單獨的 AsyncTask 執行緒將會遺失。

解:值保留

不,在這種情況下不應遺失值。它們可能在您訪問時根本沒有更新。為了解決這個問題,您可以在使用變數之前使用 null 檢查,或者在 onPostExecute() 中呼叫需要它們的函數。

介面範例

考慮以下介面實現回調的範例:

public interface AsyncResponse {
    void processFinish(String output);  // Same params as onPostExecute()
}
登入後複製

在您使用的 Activity中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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板