android asynctask with threading

时间:2012-03-30 08:04:21

标签: android android-asynctask

我创建了一个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我不明白为什么会这样?

3 个答案:

答案 0 :(得分:11)

AsyncTask会自动为您创建一个新线程,因此您在doInBackground()中执行的所有操作都在另一个线程上。
你在做什么是这样的:

  1. AsyncTask创建一个新线程并运行doInBackground()
  2. 从AsyncTask-Thread创建一个新线程(t)。
  3. doInBackground()已完成,因为它只是创建了线程t,因此跳转到onPostExecute()
  4. 线程t仍将在后台运行(但是,您不会在start()上调用t,这意味着它未启动。
  5. 相反,您希望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抛出ExceptionInterruptedException ??)