2010-09-14 2 views
2

Я немного поразмыслил над созданным исключением при использовании BaseAdapter, но я не могу найти альтернативное решение: Убедитесь, что содержимое вашего адаптера не изменен из фоновой темыAndroid: изменение содержимого адаптера из фонового потока

Что я хочу достичь, так это сохранить копию очереди сообщений в памяти и использовать эту очередь сообщений для заполнения BaseAdapter для моего ListView. Причина этого заключается в том, что очередь сообщений будет продолжать получать сообщения из сокета, даже если ListView не присутствует в данный момент (например, окно чата).

Проблема возникает, когда у меня есть активность с ListView на переднем плане, BaseAdapter привязана к какому-данных очереди сообщений, и сообщение приходит в розетку. Добавление нового сообщения в очередь вызовет исключение, упомянутое выше. Если я предварительно не заполняю свой BaseAdapter с очередью сообщений (как в базовом адаптере, имеющем собственную очередь сообщений) и обновляя оба из них при поступлении нового сообщения, я не могу найти пути решения этой проблемы.

Я действительно не хочу удвоить усилия по поддержанию этих двух очередей таким образом, конечно, есть лучший способ сделать это? Отправка широковещательных сообщений не работает ни из-за потенциальной задержки в адаптере, обслуживающей прокрутку, а в вызове notifyDataSetChanged.

+0

Какой адаптер вы действительно используете? Вы понимаете, что BaseAdapter является абстрактным? Кроме того, какое исключение вы получаете? Вы не говорите об этом. – codinguser

+0

Привет, на данный момент я просто создаю свой собственный класс, расширив BaseAdapter, внедряя методы getCount(), getItem(), getItemId() и getView(); Исключением является указанное выше: «Убедитесь, что содержимое вашего адаптера не изменено из фонового потока». Вызывается попыткой обновления набора данных адаптера из потока non-ui (в этом случае мой класс контроллера, который содержит очередь сообщений). Я пытаюсь найти способ обновить мою очередь сообщений, а также активность (если она находится на переднем плане). – Bundeeteddee

ответ

2

Используйте Handler, чтобы изменить «очередь сообщений» из основной темы приложения.

+0

Я думал о том, чтобы сделать это таким образом, но это означает, что любые сообщения, поступающие с сетевого уровня, должны будут транслироваться для Activity для подбора. Если действие не находится на переднем плане (или в стеке активности), сообщение не будет обработано. Правильно ли это звучит? – Bundeeteddee

+1

@Bundee: «но это означает, что любые сообщения, поступающие с сетевого уровня, должны будут транслироваться для того, чтобы активировать Activity». - в принципе, вы можете использовать 'Handler' в' Service' для этого, хотя я его не пробовал. – CommonsWare

+0

Просто хотел задать тот же вопрос, пока не понял, что его уже спрашивали. Я могу подтвердить, что решение CommonsWare работает. Я использовал обработчик в своем Serivce для изменения содержимого адаптера. – M2X

2

У меня была эта проблема. Оказывается, я воссоздал свой адаптер для новых данных, но старый адаптер по-прежнему был установлен в listview и иногда приводил к сбою. Поэтому я делаю что-то подобное, когда мне нужно заново создать адаптер:

//Clear adapter's array 
if (!array.isEmpty()) { array.clear(); } 
if (adapter != null) { adapter = null; } 
setListAdapter(adapter); 

//Later code 
//array gets repopulated 
//adapter gets recreated 
setListAdapter(adapter);