#java #android #multithreading #android-asynctask
#java #Android #многопоточность #android-асинхронная задача
Вопрос:
У меня есть простая асинхронная задача Android с длительным фоновым действием:
HANDLER.post(new Runnable() {
@Override
public void run() {
new AsyncTask<Context, Integer, GameTypeAdapter>() {
@Override
protected GameTypeAdapter doInBackground(Context... contexts) {
return new GameTypeAdapter(contexts[0]);//Long database action
}
@Override
protected void onPreExecute() {
pbWaiter.setVisible(View.VISIBLE);
}
@Override
protected void onPostExecute(GameTypeAdapter gameTypeAdapter) {
txtGameName.setText(settings.getGameName());
cmbType.setAdapter(gameTypeAdapter);
if (settings.getGamePlugin() != null) {
cmbType.setSelection(((GameTypeAdapter) cmbType.getAdapter()).getItemPosition(settings.getGamePlugin()));
}
sldJoker.setProgress(settings.getJoker());
pbWaiter.setVisible(View.INVISIBLE);
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getActivity());
}
});
Если метод onPostExecute вызывается потоком и была вызвана последняя строка (hideWaiter), выполнение вызовов пользовательского интерфейса становится видимым через 1/10 секунды (полсекунды в режиме отладки). В это время пользовательский интерфейс зависает, и анимация официанта останавливается.
Почему поток пользовательского интерфейса останавливается?
Спасибо.
Комментарии:
1. Почему вы создаете и запускаете асинхронную задачу в Runnable? Никогда не видел этого раньше. Запускайте асинхронные задачи из потока пользовательского интерфейса.
2. попробуйте sldJoker.setProgress(settings.getJoker()); в runOnUiThread(…) я знаю, что onPostExecute запускается в самом потоке пользовательского интерфейса, но если вы видите задержку, возможно, стоит попробовать
3. @greenapps: пожалуйста, покажите в коде: я запускаю обработчик, чтобы перейти в поток пользовательского интерфейса, потому что меня в нем нет.
4. Мммм.. Интересно. Но что такое тип pbWaiter?
5.
if the method onPostExecute is called by thread
? Что вы имеете в виду? Вы это вызываете? Вы не должны вызывать этот метод, поскольку это будет сделано классом asynctask .