情况很简单。我使用 AsyncTask 从 HttpClient 检索字符串。
现在我需要 AsyncTask 检索到的字符串来调用该字符串上的另一个方法,
因此我需要确保 AsyncTask 在调用其他方法之前已经终止。
我该怎么做呢?
感谢您的任何建议。
情况很简单。我使用 AsyncTask 从 HttpClient 检索字符串。
现在我需要 AsyncTask 检索到的字符串来调用该字符串上的另一个方法,
因此我需要确保 AsyncTask 在调用其他方法之前已经终止。
我该怎么做呢?
感谢您的任何建议。
使用简单的锁或互斥锁。基本上,在你的 : 添加一个变量和一个吸气剂AsyncTask
:
public boolean locked;
public boolean isLocked(){
return locked;
}
在你AsyncTask
的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.
我怀疑您实际上并不关心它是否已“终止”。我怀疑你只是关心它的 doInBackground 方法是否已经完成。最简单的答案是,如果 onPostExecute 或 onCancelled 已被调用,则 doInBackground 已完成。如果您需要更精细的东西,则必须执行 Phil 描述的操作:
private volatile boolean done;
//...
public boolean isDone() { return done; }
protected Result doInBackground(Params... params) {
// ...
done = true;
return result;
}
只需检查是否已调用onPostExecute()
你想做什么...请记住,如果主线程被阻塞 5 秒,用户会收到一个提示,询问用户是否要等待更长时间或退出应用程序。
如果您绝对需要该值,您甚至可能想尝试启动一个新线程(而不是 AsyncTask 执行)并使用 .join 方法等待它退出。
它通常不受欢迎(您不应该以这种方式访问 http 资源;您可能会遇到应用程序无响应的风险),但它与其他建议的解决方案没有显着不同。