2013-02-28 38 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; 
} 
相关问题