2012-05-03 3 views
0

У меня есть TableLayout, в пределах ScrollView, который обновляется постоянно с помощью AsyncTask.Android Как синхронизировать представление макета?

Я не знаю, если это «правовой», чтобы добавить/удалить строки по AsyncTask когда в то же время пользователь может быть прокрутке TableLayout.

Как я могу убедиться, что обновление не мешает прокрутке в графическом интерфейсе?

Или ОС заботится об этом для меня?

ответ

0

В Android основной поток, на котором работает приложение, является единственным потоком, который может обновлять пользовательский интерфейс. Если вы попытаетесь изменить содержимое своего макета из AsyncTask, вы получите сообщение об ошибке. Тем не менее методы AsyncTask onPreExecute и onPostExecute ARE выполняются в основном потоке, поэтому вы можете обновить интерфейс.

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

+0

Как насчет onProgressUpdate()? Он также работает на основной теме, не так ли? Можно ли добавить строки там? Если да, мне нужно синхронизировать его или просто добавить строку обычно? – ilomambo

+0

'onProgressUpdate()' также запускается в основном потоке. Совершенно нормально добавлять или удалять строки в этом методе. Тем не менее, пользователь сможет взаимодействовать с вашим приложением, пока это происходит, поэтому они, вероятно, заметят, что строки добавляются и удаляются, если они просматривают список. Пока они просто смотрят на предметы, все будет хорошо. Вы можете столкнуться с некоторыми странными ситуациями, если в рядах есть кнопки прослушивания, но я никогда не пробовал то, что вы описываете, поэтому я не знаю точно. – MattDavis

+0

Еще одна важная вещь: важно отметить, что если вы разрешаете пользователю переключать действия во время работы AsyncTask, она будет продолжена в фоновом режиме. Активность не будет уничтожена или собрана мусор, пока она не будет выполнена, и ваша задача будет по существу занимать циклы, ничего не делая. Это не должно приводить к сбою вашего приложения напрямую, так как все компоненты пользовательского интерфейса и переменные класса хранятся в памяти до тех пор, пока не будут уничтожены, но могут впоследствии привести к таким проблемам, как ошибка OOM или, в зависимости от версии Android, заблокировать будущее AsyncTask работает, потому что поток используется. – MattDavis

Смежные вопросы