Android Asynctask с потоками - PullRequest
4 голосов
/ 30 марта 2012

Я создал asynctask и в его методе doInBackground () я запустил такой поток:Я думал, что asynctask будет запускать этот поток в фоновом режиме, и когда это логическое значение true, вызывается onPostexecute (). Я не могу понять, почему это происходит?

Ответы [ 3 ]

11 голосов
/ 30 марта 2012

AsyncTask автоматически создает новый поток для вас, поэтому все, что вы делаете в doInBackground(), находится в другом потоке.
Что вы делаете так:

  1. AsyncTask создает новый поток иработает doInBackground().
  2. новый поток (t) создается из AsyncTask-Thread.
  3. doInBackground() завершен, поскольку все, что он делает, это создает поток t и, таким образом, переходит к onPostExecute().
  4. Поток t по-прежнему будет работать в фоновом режиме (однако вы не вызываете start() на t, что означает, что он не запущен).

Вместо этого вы хотитеваш doInBackground() метод выглядит примерно так:

doInBackground(){
    while(someBoolean!=true){
        //Perform some repeating action.
        Thread.sleep(100);
    } 
}
3 голосов
/ 30 марта 2012

Прежде всего, в вашем коде вы даже не запускаете поток 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();
}
1 голос
/ 30 марта 2012

onPostExecute может быть вызван только тогда, когда doInBackground имеет return -ed.В вашем коде единственный возможный способ, которым это может произойти, это sleep, бросающий Exception (InterruptedException ??)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...