Асинхронная андроида с потокованием

Я создал 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 } } 

Проблема, с которой я столкнулась, – после 1-й итерации Thread.sleep() , onPostExecute() , вместо этого я думал, что asynctask будет запускать этот поток на фоне, и когда это логическое значение истинно, то onPostexecute () вызывается. Я не могу понять Почему это происходит?

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

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

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

 doInBackground(){ while(someBoolean!=true){ //Perform some repeating action. Thread.sleep(100); } } в doInBackground(){ while(someBoolean!=true){ //Perform some repeating action. Thread.sleep(100); } } 

Прежде всего, в вашем коде вы даже не запускаете поток t , поэтому все, что происходит в doInBackground это создание нового потока, а затем переход к onPostExecute() .

Во-вторых, вам даже не нужен отдельный поток, так как doInBackground() обрабатывает это для вас, поэтому вы можете просто использовать что-то вроде

 doInBackground(){ while(someBoolean!=true){ Thread.currentThread.sleep(100); } } в 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(); } в doInBackground(){ Thread t = new Thread(new Runnable(){ public void run() { while(someBoolean!=true){ Thread.currentThread.sleep(100); } } }); t.start(); t.join(); } 

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

Intereting Posts
Android: проблема с выставлением счетов в приложении Правила нарушения правил изготовления материалов Как получить доступ к Камере через Bluetooth? Sqlite Android – как получить значение определенного столбца / строки Отображение изображения, загруженного из Интернета как аннотация – использование Picasso Ошибка: пакет com.facebook.android не существует в проекте студии Android Исключение Android HTTPS. Сброс соединения с помощью одноранговой сети Файлы расширения Apk – Лицензирование приложений – Учетная запись разработчика – NOT_LICENSED ответ Показывать пользовательскую кнопку в ActionBarSherlock для отображения меню «Скользящее» Почему этот сценарий оболочки называется скриптом python? Несколько пакетов в Android-приложении Как я могу ударить точки останова (и увидеть номера строк ошибок) при отладке javascript на Android? Обращение с iframe в Android WebView Установка неиспользуемой строки, не работающей с простым текстовым просмотром Получение фотографии и имени из контактов в android