情況非常簡單。 我使用AsyncTask從HttpClient中檢索字符串。Android:如何確保在調用另一種方法之前終止AsyncTask?
現在我需要用的AsyncTask檢索調用另一個方法對字符串,長度,
因此我需要確保的AsyncTask已終止調用其他方法之前。
我該怎麼做?
感謝您的任何建議。
情況非常簡單。 我使用AsyncTask從HttpClient中檢索字符串。Android:如何確保在調用另一種方法之前終止AsyncTask?
現在我需要用的AsyncTask檢索調用另一個方法對字符串,長度,
因此我需要確保的AsyncTask已終止調用其他方法之前。
我該怎麼做?
感謝您的任何建議。
使用簡單的鎖或互斥。基本上,加在你AsyncTask
一個變量和一個getter:在你的AsyncTask
的
public boolean locked;
public boolean isLocked(){
return locked;
}
onPreExecute
方法,添加:
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()已經被稱爲
也可以調用,需要從onPostExecute – snowCrabs 2013-02-28 14:10:26
字符串這是不行的功能,和上面提到的。你必須檢查也取消 – 2013-02-28 15:14:44
如果您絕對需要這個值,您甚至可能想嘗試啓動一個新線程(而不是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;
}
請注意,這是*不是一個互斥體,它只能工作,因爲onPostExecute在執行相同的線程上運行。 – 2013-02-28 15:16:43