簡體   English   中英

Android:如何在調用另一個方法之前確保AsyncTask被終止?

[英]Android: how to make sure an AsyncTask is terminated before I call another method?

情況很簡單。 我使用AsyncTask從HttpClient中檢索String。

現在我需要AsyncTask檢索的String來調用該String上的另一個方法,

因此我需要確保在調用其他方法之前AsyncTask已終止。

我該怎么做呢?

謝謝你的任何建議。

使用簡單的鎖或互斥鎖。 基本上,在AsyncTask添加變量和getter:

public boolean locked;

public boolean isLocked(){
    return locked;
}

AsyncTaskonPreExecute方法中,添加:

locked = true;

並在onPostExecute方法中添加:

locked = false;

然后可以將任何外部方法放入循環中,例如:

MyTask foo = new MyTask();
foo.execute();
while (foo.isLocked())
{
    //wait, or sleep, or whatever
}
//here is where you execute code.

只需檢查是否已調用onPostExecute()

如果您絕對需要該值,您甚至可能希望嘗試啟動新線程(而不是AsyncTask執行)並使用.join方法等待它退出。

它通常不贊成(你不應該以這種方式訪問​​http資源;你冒着沒有響應的應用程序的風險),但它與其他建議的解決方案沒有太大的不同。

你想做什么...請記住,如果主線程被阻止了5秒鍾,用戶會得到一個提示,詢問用戶是想等待更長時間還是退出應用程序。

我懷疑你實際上並不關心它是否已“終止”。 我懷疑你只關心它是否已經完成了doInBackground方法。 最簡單的答案是,如果調用了onPostExecute或onCancelled,則doInBackground完成。 如果你需要更多的東西找到粒度,你將不得不像菲爾描述的那樣做:

private volatile boolean done;

//...

public boolean isDone() { return done; }

protected Result doInBackground(Params... params) {
    // ...
    done = true;
    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM