我创建了一个asynctask并在其doInBackground()方法中启动了这样一个线程:
private class myAsyntask extends Asynctask{
doInBackground(){
Thread t = new Thread(new Runnable(){
public void run()
{
while(someBoolean!=true){
Thread.currentThread.sleep(100);
}
}
});
}
onPostExecute(){
//do something related to that variable
}
}
我面临的问题是在Thread.sleep()
的第一次迭代之后,onPostExecute()
被调用,而我认为asynctask将在后台运行此线程,当该布尔值为true时,onPostexecute()被调用.I我不明白为什么会这样?
答案 0 :(得分:11)
AsyncTask会自动为您创建一个新线程,因此您在doInBackground()
中执行的所有操作都在另一个线程上。
你在做什么是这样的:
doInBackground()
。 t
)。 doInBackground()
已完成,因为它只是创建了线程t,因此跳转到onPostExecute()
。 start()
上调用t
,这意味着它未启动。相反,您希望doInBackground()
方法看起来像这样:
doInBackground(){
while(someBoolean!=true){
//Perform some repeating action.
Thread.sleep(100);
}
}
答案 1 :(得分:3)
首先,在您的代码中,您甚至无法启动线程t
,因此doInBackground
中发生的所有事情都是创建新线程,然后转到onPostExecute()
其次,你甚至不需要单独的线程,因为doInBackground()
会为你处理这个问题,所以你可以使用像
doInBackground(){
while(someBoolean!=true){
Thread.currentThread.sleep(100);
}
}
但是,如果您希望坚持使用单独的主题,则可以使用.join();启动主题并等待其完成
doInBackground(){
Thread t = new Thread(new Runnable(){
public void run() {
while(someBoolean!=true){
Thread.currentThread.sleep(100);
}
}
});
t.start();
t.join();
}
答案 2 :(得分:1)
onPostExecute
只能在doInBackground
return
编辑时调用。在您的代码中,唯一可能的方法是sleep
抛出Exception
(InterruptedException
??)