Android - Как обновить ArrayAdapter в асинхронном режиме? - PullRequest
0 голосов
/ 25 октября 2011

Я использую класс AsyncTask для добавления, удаления и удаления элементов из моего ArrayAdapter. К сожалению, когда выполняется любая из этих задач, ArrayAdapter хочет notifyDataSetChanged(), что требует запуска потока на uiThread.

Если я использую runOnUiThread(new Runnable(){...}); для асинхронного обновления ArrayAdapter, разве это не противоречит цели попытки обновить его в новом потоке для начала?

Какой здесь лучший подход?

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

Do .notifyDataSetChanged() insde onPostExecute() метод. onPostExecute() метод работает на Ui-Thread. Если вашему приложению требуется периодически обновлять во время выполнения метода doInBackground(), используйте publishProgress() (который вызовет onProgressUpdate() метод) и вызовите notifyDataSetChanged() внутри onProgressUpdate() метода, который также выполняется в потоке Ui.

1 голос
/ 25 октября 2011

Просто чтобы добавить что-то к тому, что уже сказали все остальные, после того, как ваша задача будет выполнена, вы можете захотеть снова установить адаптер (или новый) для представления, с которым вы работаете.

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

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

0 голосов
/ 25 октября 2011

Чтобы ответить на ваш первый вопрос, вызов runOnUiThread не отменяет эту цель, если единственное, что вы вызываете в потоке пользовательского интерфейса, это notifyDataSetChanged().Выполняйте все свои реальные, потенциально долгосрочные задачи в AsycnAdpater, а затем, когда вы будете готовы сообщить, что действия изменились, позвоните runOnUiThread().Он будет выполнять только те команды, которые вы указываете в Runnable, который вы ему передаете.

Тем не менее, вместо использования AsyncTask, попробуйте использовать AsyncTaskLoader .AsycnTaskLoaders были разработаны почти специально для асинхронного заполнения списков.Они не были представлены до уровня API 10, но вы все равно можете получить к ним доступ со старых уровней API, используя пакет поддержки android .

...