Я запускаюсь в IllegalStateException, обновляя базовый список адаптера (может быть, ArrayAdapter или расширение BaseAdapter, я не помню). На данный момент у меня нет или не помню текст исключения, но он говорит что-то о том, что содержимое списка изменяется без изменения Адаптера об изменении.Каков наилучший способ обновления базовых данных адаптера?
Этот список/может быть обновлен из другой темы, кроме темы пользовательского интерфейса (main). После того как я обновил этот список (добавив элемент), я вызываю notifyDataSetChanged. Проблема заключается в том, что адаптер или ListView, подключенный к адаптеру, пытается обновить себя до вызова этого метода. Когда это происходит, вызывается исключение 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(). Этот объект Queue может иметь элементы, добавленные или удаленные из любого количества потоков.
У меня есть один вид «очереди», в котором содержится адаптер. Эта операция в своем методе onCreate() регистрирует прослушиватель Observer для моего объекта Queue. В методе update() Observer я вызываю notifyDataSetChanged() на адаптере.
Я добавил много выходных данных журнала и определил, что, когда это IllegalStateExcption происходит, мой обратный вызов наблюдателя никогда не вызывался. Так что, как будто адаптер заметил изменение List перед тем, как Observer получил возможность уведомить своих наблюдателей и вызвать мой метод для уведомления адаптера, что содержимое было изменено.
Итак, я полагаю, что я прошу, это хороший способ подгонять адаптер? Это проблема, потому что я обновляю содержимое адаптера из потока, отличного от потока пользовательского интерфейса? Если это так, у меня может возникнуть решение (передайте объект Queue обработчику потока пользовательского интерфейса при его создании и сделайте все изменения в List с помощью этого обработчика, но это кажется неправильным).
Я понимаю, что это очень открытое сообщение, но я немного потерял это и буду благодарен за любые комментарии к тому, что я написал.
Спасибо за ваши комментарии, но я все еще смущен несколькими вещами, если вы не возражаете помочь дальше. Имя объекта «Очередь» является немного неправильным - это скорее очередь медиа-роликов для воспроизведения, или песни для воспроизведения. Это список элементов с currentIndex int. Я понял, что адаптер является просто мостом между моей моделью (моим списком) и представлением (ListView). Что делать, если мне нужно обновить данные, отображаемые в представлении другого объекта, где у меня нет доступа к адаптеру? Кажется естественным обновить базовый список, возможно, из Runnable, если задача, выполняющая это добавление, может блокироваться. – skyler
«Я понял, что адаптер является просто мостом между моей моделью (мой список) и представлением (ListView)». Это вообще правда. «Что делать, если мне нужно обновить данные, отображаемые в представлении другого объекта, где у меня нет доступа к адаптеру?» Скорее всего, у вас нет доступа к списку, тогда вам понадобится более сложная стратегия. «Кажется естественным обновить базовый список, возможно, из Runnable, если задача, выполняющая этот add, может блокироваться». IMHO, проблема с потоками является проблемой пользовательского интерфейса, поэтому я рекомендую, чтобы ваш адаптер был одним из них для решения проблемы безопасности потоков. – CommonsWare
Но вы можете реализовать его, как хотите, до тех пор, пока вы обновляете адаптер только в основном приложении. – CommonsWare