powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Проблема с RunOnUiThread
5 сообщений из 5, страница 1 из 1
Проблема с RunOnUiThread
    #38549351
Витяй1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше у меня было Activity, содержащее два LinearLayout. При открытии этого активити, один LinearLayout отображался сразу, а другой спустя несколько секунд и всё это время на месте незагруженного LinearLayout крутился ProgressBar (сделано это было через AsyncTask). При нажатии кнопки "назад" из-за недогрузившегося LinearLayout'a приложение часто вылетало с ошибкой и мне сказали изменить метод onPostExecute в AsyncTask, добавить в него runOnUiThread, чтобы активити успело загрузится полностью и не было ошибки, если вдруг пользователь нажмет "назад" раньше времени. Я это сделал, всё работает, приложение вроде не вылетает, но теперь Активити больше не грузится "по частям". Нажимаешь кнопку, чтоб открыть его - после этого проходит несколько секунд и оно показывается сразу полностью со всеми загруженными лайаутами, нет больше ProgressBar'а, хотя я его оставил. Как это исправить? Первый LinearLayout создавался в методе onCreate() и только второй в AsyncTask через runOnUiThread, так почему я не вижу вначале первый лайаут и только потом второй, а сразу оба, при этом приходится ждать.


вот код класса, реализующего AsyncTask:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public class LoadL extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            bar.setVisibility(View.VISIBLE); // ProgressBar, который больше не отображается
        }

        @Override
        protected Void doInBackground(Void... params) {
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            
           MyActivity.this.runOnUiThread(new Runnable(){
                public void run(){
                	displayList(); // метод, который строит второй LinearLayout
                }
            });
            
            bar.setVisibility(View.INVISIBLE);
            expLV.setVisibility(View.VISIBLE);

        }
    }
...
Рейтинг: 0 / 0
Проблема с RunOnUiThread
    #38549383
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что тыкаешь пальцем в небо, не пытаясь понять, что делаешь. метод onPostExecute выполняется в GUI-потоке приложения и помещая туда "долгоиграющий" код ты убиваешь смысл AsyncTask на корню. а runOnUiThread в этом методе - это вообще масло масленное по вышеуказанной причине. код должен оставаться в doInBackground, при обрыве процесса AsyncTask нужно прерывать, а тот в свою очередь должен во время длительной процедуры проверять не прерван ли он. кроме того есть еще муторные примеры как восстанавливать работу AsyncTask при повороте экрана и прочее, но для начала разберись со штатной остановкой
...
Рейтинг: 0 / 0
Проблема с RunOnUiThread
    #38549394
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати да.
...
Рейтинг: 0 / 0
Проблема с RunOnUiThread
    #38549398
Витяй1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaпотому что тыкаешь пальцем в небо, не пытаясь понять, что делаешь. метод onPostExecute выполняется в GUI-потоке приложения и помещая туда "долгоиграющий" код ты убиваешь смысл AsyncTask на корню. а runOnUiThread в этом методе - это вообще масло масленное по вышеуказанной причине. код должен оставаться в doInBackground, при обрыве процесса AsyncTask нужно прерывать, а тот в свою очередь должен во время длительной процедуры проверять не прерван ли он. кроме того есть еще муторные примеры как восстанавливать работу AsyncTask при повороте экрана и прочее, но для начала разберись со штатной остановкой
У меня там два класса, реализующих AsyncTask, один делает LinearLayout, другой файлы грузит. Метод
Код: java
1.
2.
3.
4.
5.
@Override
	public void onBackPressed() {
                  .....
		}
	}


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

я понимаю, что это всё масло масляное и г*внокод, но как сказали сделать, так и делаю, опыта очень мало что-то нормальное изобразить
...
Рейтинг: 0 / 0
Проблема с RunOnUiThread
    #38549403
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Витяй1991я понимаю, что это всё масло масляное и г*внокод, но как сказали сделать, так и делаю
хрень подсказали, а скорее всего ты так же внятно объяснил как и здесь ("про ошибку") - тебе и протелепатили, впрочем применительно к AsyncTask все равно не правильно, нафиг ему runOnUI не впился, у него свой publishProgress и onPostExecute есть.

я тебе описал как надо - работника прерывать, в самом работнике проверять isCancelled()
ну и кроме того смотреть в чем конкретно ошибка.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Проблема с RunOnUiThread
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]