Android: AsyncTask: длительное время выполнения после вызова onPostExecute

#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 .