3

情况很简单。我使用 AsyncTask 从 HttpClient 检索字符串。

现在我需要 AsyncTask 检索到的字符串来调用该字符串上的另一个方法,

因此我需要确保 AsyncTask 在调用其他方法之前已经终止。

我该怎么做呢?

感谢您的任何建议。

4

5 回答 5

2

使用简单的锁或互斥锁。基本上,在你的 : 添加一个变量和一个吸气剂AsyncTask

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.
于 2013-02-28T14:09:03.123 回答
1

我怀疑您实际上并不关心它是否已“终止”。我怀疑你只是关心它的 doInBackground 方法是否已经完成。最简单的答案是,如果 onPostExecute 或 onCancelled 已被调用,则 doInBackground 已完成。如果您需要更精细的东西,则必须执行 Phil 描述的操作:

private volatile boolean done;

//...

public boolean isDone() { return done; }

protected Result doInBackground(Params... params) {
    // ...
    done = true;
    return result;
}
于 2013-02-28T14:47:14.567 回答
1

只需检查是否已调用onPostExecute()

于 2013-02-28T14:06:45.057 回答
1

你想做什么...请记住,如果主线程被阻塞 5 秒,用户会收到一个提示,询问用户是否要等待更长时间或退出应用程序。

于 2013-02-28T14:22:54.713 回答
1

如果您绝对需要该值,您甚至可能想尝试启动一个新线程(而不是 AsyncTask 执行)并使用 .join 方法等待它退出。

它通常不受欢迎(您不应该以这种方式访问​​ http 资源;您可能会遇到应用程序无响应的风险),但它与其他建议的解决方案没有显着不同。

于 2013-02-28T14:12:15.520 回答