Подтвердить что ты не робот

Android: обновить Listview после Thread загружает данные из сети

  • Мне нравится, что мой GUI появляется сразу, когда пользователь запускает приложение.
  • Затем некоторые данные (текст, картинки) загружаются в фоновом режиме (например, приложение YouTube).
  • ListView и Gallery автоматически обновляются с помощью этих новых данных.

Я запускаю свой ListView, запускаю Thread и загружаю данные... а затем ListView не обновляется! Несколько человек сказали мне, что я должен использовать notifyDataSetChanged(). Но я не могу разместить эту команду в моем потоке (просто неизвестно).

Любые идеи?

4b9b3361

Ответ 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.