当用户点击一个上下文菜单项,然后反复点击另一个菜单项时,我已经到处寻找了为什么我们的应用程序会崩溃的答案。这是我的堆栈跟踪,所有这些都在Android内部类上:
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): FATAL EXCEPTION: main
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): 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(16908808, class com.android.internal.app.AlertController$RecycleListView) with Adapter(class com.android.internal.view.menu.MenuBuilder$MenuAdapter)]
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.widget.ListView.layoutChildren(ListView.java:1550)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2192)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.widget.ListView.onTouchEvent(ListView.java:3377)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.view.View.dispatchTouchEvent(View.java:3766)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1720)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1117)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.app.Dialog.dispatchTouchEvent(Dialog.java:642)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1704)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.view.ViewRoot.handleMessage(ViewRoot.java:1794)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.os.Handler.dispatchMessage(Handler.java:99)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.os.Looper.loop(Looper.java:143)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at android.app.ActivityThread.main(ActivityThread.java:4701)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at java.lang.reflect.Method.invokeNative(Native Method)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at java.lang.reflect.Method.invoke(Method.java:521)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-11 15:08:30.904: ERROR/AndroidRuntime(3489): at dalvik.system.NativeStart.main(Native Method)
11-11 15:08:30.912: WARN/ActivityManager(1261): Force finishing activity com.pyxismobile.pyxWholesaler.ui.activity/.GNBActivity
11-11 15:08:30.943: WARN/WindowManager(1261): No window to dispatch pointer action 1
11-11 15:08:30.943: WARN/WindowManager(1261): No window to dispatch pointer action 0
11-11 15:08:30.943: WARN/WindowManager(1261): No window to dispatch pointer action 1
我们的基本设计是在Activity类上覆盖onCreateContextMenu和onContextMenuItem。在创建时,代码基本上填充了一个MyMenuItems集合,其中每一项都有一个run方法来执行我们需要菜单项执行的任何操作。onContextMenuItem基本上从传入的MenuItem中获取id,查找给定ID的集合,然后运行该run方法。
为了缩小原因的范围,我注释掉了run部分,不做任何事情。这仍然会导致异常。我没有看到在创建和点击我们要修改任何数据的地方之间有什么特别的变化。在创造中,所有的事情都只做一次。
我试图创建一个非常简单的测试应用程序,但是我无法使此异常发生。我还简单地看了一下Android内部的源代码,看看我是否能弄明白什么,但什么也没发现。
如果任何人有任何建议,我可能做错了什么,或调查它将不胜感激。
编辑:我也决定这是设备不可知的。我已经能够在多个设备上重新创建,但在极少数情况下它不会发生。我的假设是存在某种类型的竞争条件。
发布于 2011-04-21 21:29:16
设置myMenuAdapter.registerDataSetObserver(DataSetObserver observer)
(API here)以记录发生更改的时间,并尝试在手机连接到运行adb logcat
的PC时复制错误。这可能会给你一个线索,让你知道它什么时候被修改。
也可能是您再次初始化适配器,而不是重用它?
发布于 2011-04-23 05:29:48
在将适配器添加到ListView后,尽量不要更改适配器。
如果在使用过程中仍然需要更改ListView的内容,那么在适配器更新期间将ListView的set the visibility设置为GONE,并在更新后将其恢复为VISIBLE。
https://stackoverflow.com/questions/4513935
复制相似问题