Android: обновление списка после того, как поток загружает данные из сети - PullRequest
15 голосов
/ 16 марта 2009
  1. Мне нравится, что мой GUI появляется сразу же, когда пользователь запускает приложение.
  2. Затем некоторые данные (текст, картинки) загружаются в фоновом режиме (например, приложение YouTube).
  3. ListView и Галерея обновляются автоматически с этими новыми данными.

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

Есть идеи?

Ответы [ 3 ]

19 голосов
/ 31 мая 2009

У меня такая же проблема ... и я очень обрадовался, когда наткнулся на этот вопрос. Но нет ответа? : - (

После того, как проблема оставалась на две недели, я нашел решение здесь :

Короче говоря:

Цитата сверху ссылка:

Мы должны использовать объект 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 () обработчика.

Надеюсь, это поможет другим.

4 голосов
/ 30 апреля 2010

Вы можете использовать slowAdapter для обновления просмотра:

SlowAdapter = new SlowAdapter(this);

list.setAdapter(SlowAdapter);
SlowAdapter.notifyDataSetChanged();
3 голосов
/ 15 июня 2010

Просто нашел это сам, читая эту ветку и пробуясь вокруг.

Short: Метод AsyncTask onProgressUpdate может касаться вида : http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)

Справочная информация: мне нужно было вызывать запрос на моем курсоре, чтобы ListView продолжал обновляться, пока задача заполняла базу данных. Вызов запроса, выполненный в doInBackground , завершился неудачно с упомянутым CalledFromWrongThreadException , но тот же код в onProgressUpdate работает.

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