ошибка Android ListView…. Адаптер не должен быть установлен из фонового потока ….!

#android

#Android

Вопрос:

Я работаю на TabHost с 4 tabwidget, у моего виджета all four tab есть ListActivity, который показывает список элементов из разных объектов arraylist, установленных из классов компонентов синтаксического анализа Json..

Сейчас приложение работает в режиме f9, но,,, примерно в соотношении 5 к 1 показывает исключение, что мой адаптер сброшен, но ListView не может отображать данные, поскольку адаптер установлен из фонового потока.

Я не могу предоставить данные адаптера из того же потока пользовательского интерфейса, потому что мои классы компонентов и диспетчер данных определены в другом месте….

Я использовал adapter.notifyDataSetChanged() там, где это необходимо…
Пожалуйста, не предлагайте этого…

С уважением,

Arpit

Ответ №1:

Даже если что-то определено в другом месте, вы все равно сможете установить адаптер с помощью:

 runOnUiThread(new Runnable() {

@Override
        public void run() {
            list.setAdapter(adapter);
        }
});
  

или просто опубликуйте runnable в потоке пользовательского интерфейса:

 view.post(new Runnable() {

    @Override
    public void run() {
        list.setAdapter(adapter);
    }
});
  

Надеюсь, это поможет, Кристофер

Ответ №2:

Я бы рекомендовал использовать Handler (https://developer.android.com/reference/android/os/Handler.html ) чтобы выполнить все изменения в адаптере: создайте экземпляр обработчика для каждого действия, а затем отправьте Message (https://developer.android.com/reference/android/os/Message.html ) в этот обработчик из ваших классов data manager / bean с новыми данными для адаптера списка. Затем вы можете безопасно обновить адаптер из обработчика, поскольку он будет выполнять свою работу в потоке пользовательского интерфейса.

Краткая запись здесь: https://web.archive.org/web/20200810154212/http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html и есть ряд других вопросов по SO, которые описывают это.