首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android - Context Menu -由于MenuBuilder$MenuAdapter更改但AlertController$RecycleListView未收到通知而导致的异常

Android - Context Menu -由于MenuBuilder$MenuAdapter更改但AlertController$RecycleListView未收到通知而导致的异常
EN

Stack Overflow用户
提问于 2010-12-23 05:31:03
回答 2查看 1K关注 0票数 3

当用户点击一个上下文菜单项,然后反复点击另一个菜单项时,我已经到处寻找了为什么我们的应用程序会崩溃的答案。这是我的堆栈跟踪,所有这些都在Android内部类上:

代码语言:javascript
运行
复制
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内部的源代码,看看我是否能弄明白什么,但什么也没发现。

如果任何人有任何建议,我可能做错了什么,或调查它将不胜感激。

编辑:我也决定这是设备不可知的。我已经能够在多个设备上重新创建,但在极少数情况下它不会发生。我的假设是存在某种类型的竞争条件。

EN

回答 2

Stack Overflow用户

发布于 2011-04-21 21:29:16

设置myMenuAdapter.registerDataSetObserver(DataSetObserver observer) (API here)以记录发生更改的时间,并尝试在手机连接到运行adb logcat的PC时复制错误。这可能会给你一个线索,让你知道它什么时候被修改。

也可能是您再次初始化适配器,而不是重用它?

票数 0
EN

Stack Overflow用户

发布于 2011-04-23 05:29:48

在将适配器添加到ListView后,尽量不要更改适配器。

如果在使用过程中仍然需要更改ListView的内容,那么在适配器更新期间将ListView的set the visibility设置为GONE,并在更新后将其恢复为VISIBLE。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4513935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档