Я сталкиваюсь с IllegalStateException, обновляющим базовый List на Adapter (может быть ArrayAdapter или расширение BaseAdapter, я не помню). В настоящий момент у меня нет или не помню текст исключения, но он говорит о том, что содержание Списка изменяется без уведомления адаптера об этом изменении.
Этот список / может / обновляться из другого потока, кроме потока пользовательского интерфейса (основного). После того, как я обновляю этот список (добавляя элемент), я вызываю notifyDataSetChanged. Похоже, проблема заключается в том, что Adapter или ListView, подключенный к Adapter, пытается обновить себя до вызова этого метода. Когда это происходит, создается исключение IllegalStateException.
Если я установил видимость ListView на GONE до обновления, то снова VISIBLE, ошибки не возникнет. Но это не всегда практично.
Я где-то читал, что вы не можете изменить базовое это из другого потока - это, казалось бы, ограничивает шаблон MVC, так как с этим конкретным списком я хочу добавить элементы из разных потоков. Я предполагал, что до тех пор, пока я вызывал notifyDataSetChanged (), я был бы в безопасности - что Адаптер не возвращался к базовому списку, пока не был вызван этот метод, но, похоже, это не так.
Полагаю, я спрашиваю: можно ли безопасно обновлять базовый список из потоков, отличных от пользовательского интерфейса? Кроме того, если я хочу изменить данные в адаптере, я должен изменить базовый список или сам адаптер (с помощью методов add () и т. Д.). Изменение данных через адаптер кажется неправильным.
Я натолкнулся на тему на другом сайте от кого-то, у кого, похоже, есть проблема, похожая на мою: http://osdir.com/ml/Android-Developers/2010-04/msg01199.html (отсюда я взял идею Visibility.GONE и .VISIBLE).
Чтобы дать вам лучшее представление о моей конкретной проблеме, я немного опишу, как настроены мой список, адаптер и т. Д.
У меня есть объект с именем Queue, который содержит LinkedList. Очередь расширяет Observable, и когда вещи добавляются в ее внутренний список через его методы, я вызываю setChanged () и notifyListeners (). Этот объект очереди может иметь элементы, добавленные или удаленные из любого числа потоков.
У меня есть одно действие "представление очереди", которое содержит адаптер. Эта операция в своем методе onCreate () регистрирует прослушиватель Observer для моего объекта Queue. В методе Observer update () я вызываю notifyDataSetChanged () для адаптера.
Я добавил много выходных данных журнала и определил, что при возникновении этой IllegalStateExcption мой обратный вызов Observer никогда не вызывался. Так что, как будто Адаптер заметил изменение Списка до того, как Наблюдатель имел возможность уведомить своих Наблюдателей и вызвать мой метод, чтобы уведомить Адаптер об изменении содержимого.
Итак, я полагаю, что я спрашиваю, это хороший способ установить адаптер? Это проблема, потому что я обновляю содержимое адаптера из потока, отличного от потока пользовательского интерфейса? Если это так, я могу иметь в виду решение (дать объекту Queue обработчик потоку пользовательского интерфейса при его создании и выполнить все модификации List с использованием этого обработчика, но это кажется неправильным).
Я понимаю, что это очень открытый пост, но я немного растерялся и буду благодарен за любые комментарии по поводу того, что я написал.