Android: обновить Listview после Thread загружает данные из сети
- Мне нравится, что мой GUI появляется сразу, когда пользователь запускает приложение.
- Затем некоторые данные (текст, картинки) загружаются в фоновом режиме (например, приложение YouTube).
- ListView и Gallery автоматически обновляются с помощью этих новых данных.
Я запускаю свой ListView, запускаю Thread и загружаю данные... а затем ListView не обновляется!
Несколько человек сказали мне, что я должен использовать notifyDataSetChanged()
.
Но я не могу разместить эту команду в моем потоке (просто неизвестно).
Любые идеи?
Ответы
Ответ 1
У меня такая же проблема... и я взволновался, когда столкнулся с этим вопросом. Но нет ответа?: - (
После того, как проблема возникла примерно две недели, я нашел здесь :
Короче говоря:
Цитата из ссылки выше:
Мы должны использовать объект Handler, потому что мы не можем обновлять большинство объектов пользовательского интерфейса, пока в отдельном потоке. Когда мы отправляем сообщение обработчику, он получит сохраняется в очереди и выполняется пользовательский интерфейс как можно скорее.
Как только вы проверите код, вы увидите, что говорит автор.
ПРИМЕЧАНИЕ. Даже с обработчиком Android может не позволить вам обновлять объект вида из метода run() потока.
Я получил эту ошибку:
05-31 02:12:17.064: ERROR/AndroidRuntime(881):
android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
Чтобы обойти это, я обновил массив данных в моем методе run() и использовал этот массив для обновления представления в методе handleMessage() обработчика.
Я надеюсь, что это поможет другим.
Ответ 2
Вы можете использовать slowAdapter для обновления представления:
SlowAdapter slowAdapter = new SlowAdapter(this);
list.setAdapter(slowAdapter);
slowAdapter.notifyDataSetChanged();
Ответ 3
Просто нашел его сам, читая эту тему и пробовав.
Короткие: метод AsyncTask onProgressUpdate может касаться представления: http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)
Фон: мне нужно было вызвать запрос на мой курсор, чтобы ListView постоянно обновлялся, когда задача заполняет базу данных. Требование, сделанное в doInBackground, не удалось с упомянутым CalledFromWrongThreadException, но работает тот же код в onProgressUpdate.