Как правильно вызвать AsyncTask из отдельного потока? - PullRequest
1 голос
/ 09 июня 2011

Я занимаюсь разработкой игры, которая запускается в отдельном потоке.Теперь мне нужно скачать изображение из Интернета.Я написал AsyncTask класс для этого, но я не могу понять, как правильно вызвать его из моей ветки игры?На самом деле мой AsyncTask блокируется, хотя мне нужно подождать, пока изображение загрузится.Если я использую runOnUIThread, он не блокирует мою ветку и идет дальше, что мне совсем не подходит.Я пробовал также использовать Looper.prepare() перед запуском AsyncTask, но у этого также есть некоторые проблемы: Looper.myLooper().quit(), похоже, не работает, и если я пытаюсь вызвать AsyncTask еще раз, я получаю исключениеговоря мне, что я пытаюсь позвонить Looper.prepare() во второй раз.Как мне поступить?Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Если ваш фоновый поток все равно заблокируется, вам не нужен AsyncTask, и вы можете загружать изображения непосредственно в этом потоке.Для того, чтобы публиковать сообщения в пользовательском интерфейсе, вам необходимо настроить Handler с помощью петлителя.Один из вариантов - передать обработчик, созданный в потоке пользовательского интерфейса.Другой вариант - передать некоторый контекст в фоновый поток и выполнить

Handler h = new Handler(context.getMainLooper());

Если вам нужно обновить прогресс во время загрузки изображения, вы можете использовать AsyncTask и использовать обработчик, созданный, как описано.

1 голос
/ 09 июня 2011

если ваш игровой поток не является вашим основным потоком, то есть если это не поток пользовательского интерфейса, то вызовите обработчик из вашего игрового потока.теперь из этого обработчика вызовите вашу асинхронную задачу.

просто вызовите что-то вроде этого.

hm.sendEmptyMessage(0);

Handler hm = new Handler(){


public void handleMessage(Message msg)
{
//call async task.
}

};

Спасибо.

...