2013-02-28 61 views

回答

2

使用簡單的鎖或互斥。基本上,加在你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. 
+4

請注意,這是*不是一個互斥體,它只能工作,因爲onPostExecute在執行相同的線程上運行。 – 2013-02-28 15:16:43

1

只是檢查是否onPostExecute()已經被稱爲

+1

也可以調用,需要從onPostExecute – snowCrabs 2013-02-28 14:10:26

+0

字符串這是不行的功能,和上面提到的。你必須檢查也取消 – 2013-02-28 15:14:44

1

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

它通常會被人忽視(您不應該以這種方式訪問​​http資源;您可能會遇到無響應的應用程序),但它與其他建議的解決方案沒有太大區別。

1

任何你想要做什麼...... 記住,如果主線程 受阻5秒,用戶得到一個提示,詢問用戶是否要等待更長的時間 或退出應用程序。

1

我懷疑你實際上並不關心它是否已「終止」。我懷疑你只是在意它是否doInBackground方法已經完成。最簡單的答案是,如果onPostExecute或onCancelled已被調用,則doInBackground完成。如果你需要更多的東西找到細粒度,你必須做一些像菲爾介紹:

private volatile boolean done; 

//... 

public boolean isDone() { return done; } 

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