Android: IllegalStateException - Когда это брошено?

В моем приложении иногда выдается следующее исключение:

07-28 14:49:25.398: ERROR/AndroidRuntime(8097):
java.lang.IllegalStateException: The content of the adapter has changed
but ListView did not receive a notification. Make sure the content of
your adapter is not modified from a background thread, but only from the
UI thread. [in ListView(2131099717, class android.widget.ListView) with
Adapter(class ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter)]
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.ListView.layoutChildren(ListView.java:1432)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.AbsListView.onLayout(AbsListView.java:1113)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1108)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.onLayout(LinearLayout.java:920)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.ViewRoot.performTraversals(ViewRoot.java:996)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.os.Handler.dispatchMessage(Handler.java:99)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.os.Looper.loop(Looper.java:123)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
android.app.ActivityThread.main(ActivityThread.java:4338)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
java.lang.reflect.Method.invokeNative(Native Method)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
java.lang.reflect.Method.invoke(Method.java:521)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
dalvik.system.NativeStart.main(Native Method)

Трудно найти ошибку, потому что в stacktrace ни один из моих методов не перечислен. Так, кто-либо знает, когда это исключение выдается? Спасибо за любые подсказки.

9
задан Rich Schuler 28 July 2010 в 14:27
поделиться

4 ответа

Вы можете увидеть ошибку в трассировке стека:

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

Вам следует заглянуть в один из ваших потоков и синхронизировать его с вашим потоком пользовательского интерфейса.

В Android это можно сделать с помощью Handler.

http://developer.android.com/guide/appendix/faq/commontasks.html#threading

4
ответ дан 4 December 2019 в 07:22
поделиться

Он сообщает вам класс, в котором возникает ошибка: ch.uzh.csg.games4blue.gamebase.view.UserView содержит внутри класс с именем UserAdapter .

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

Обычно вы создаете ListView, вы создаете адаптер, вы устанавливаете адаптер в списке, и все готово. Об остальном позаботится ОС Android. Однако то, что вы пытаетесь сделать, немного сложнее. Вы пытаетесь время от времени обновлять данные в адаптере. Вы можете себе представить, что в случае изменения данных адаптера необходимо будет сообщить об этом списку, верно? Если вы показываете список из 2 элементов и внезапно добавляете еще 2 элемента в адаптер, то теперь в списке должны отображаться 4 элемента! Однако было бы действительно неэффективно, если бы listview постоянно проверял, не изменился ли адаптер, верно? Итак, что должно произойти, так это то, что listview будет предполагать, что адаптер не изменится, и адаптер уведомит listview, если он изменится.(Это соглашение между listview и адаптером дает другие преимущества, например, listview может кэшировать некоторые элементы, полученные от адаптера, для быстрого доступа. Также, если на экране отображается 10 элементов списка, список может быть уже запрошен 14 элементов. Таким образом, если вы прокручиваете вверх или вниз, по крайней мере для 2 элементов в любом направлении ListView уже имеет данные для отображения!)

Однако вы не смогли уведомить listview о том, что данные внутри переходника поменяли. Где-то внутри UserAdapter или UserView данные меняются! Чтобы упростить задачу для всех, возможно, вы могли бы опубликовать полный класс UserView? Могу поспорить, что у вас есть некоторый объект данных, такой как ArrayList, в качестве частной переменной внутри класса UserView. Внутри класса UserAdapter вы передаете эти данные в ListView. Однако где-то внутри класса UserView вы изменяете этот набор данных, после вы уже предоставили его ListView.

Отказ от ответственности: я в основном копирую здесь другие ответы, но я думаю, что смогу дать более четкое представление о том, что происходит, если объединю 2–3 предоставленных ответа.

Отказ от ответственности 2: Я устал, и это кажется плохо написано. Сделать это вики в надежде, что кто-то уберет мой ночной беспорядок. Если что-то непонятно, просто скажите и удалите его

22
ответ дан 4 December 2019 в 07:22
поделиться

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

1
ответ дан 4 December 2019 в 07:22
поделиться

Если вы используете ch.uzh.csg.games4blue.gamebase.view.UserView $ UserAdapter .

2
ответ дан 4 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: