情况非常简单。 我使用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