Android - 上下文菜单 - 由于 MenuBuilder$MenuAdapter 在没有 AlertController$RecycleListView 收到通知的情况下更改而导致异常

标签 android contextmenu

我四处搜索以找到当用户单击一个上下文菜单项然后重复单击另一个时我们的应用程序崩溃的原因。这是我的堆栈跟踪,全部在 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

我们的基本设计是在我们覆盖 onCreateContextMenu 和 onContextMenuItem 的 Activity 类上。在创建时,代码基本上填充了 MyMenuItems 的集合,其中每个项目都有一个 run 方法来执行我们需要菜单项执行的任何操作。 onContextMenuItem 基本上从传入的 MenuItem 中获取 ID,查找给定 ID 的集合,然后运行该运行方法。

为了尝试缩小原因范围,我已将运行部分注释掉以不执行任何操作。这仍然会导致异常。我没有看到在创建和单击我们将修改任何数据的位置之间有什么特别之处。一切都在创建中完成。

我试图创建一个非常简单的测试应用程序,但是我无法让这个异常发生。我还简要地查看了内部 Android 源代码,看看我是否能找出任何东西,但没有任何发现。

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

编辑:我还确定它与设备无关。我已经能够在多个设备上重新创建,但在极少数情况下它不会发生。我的假设是存在某种竞争条件。

最佳答案

设置一个 myMenuAdapter.registerDataSetObserver(DataSetObserver observer) ( API here ) 来记录更改发生的时间,并尝试通过连接到运行 adb logcat 的 PC 的手机复制错误。这可能会为您提供修改时间的线索。

是否也可以重新初始化一个适配器而不是重新使用它?

关于Android - 上下文菜单 - 由于 MenuBuilder$MenuAdapter 在没有 AlertController$RecycleListView 收到通知的情况下更改而导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4513935/

相关文章:

android - Android SDK :How facebook check the Hash key?

c# - WPF Caliburn.Micro ItemsControl ContextMenu 找不到方法

android - 获取 PopupMenu 的上下文,如 ContextMenu

windows - 创建新文件后在资源管理器中的 IShellView::SelectItem

java - 如何将 primefaces 上下文菜单添加到数据表标题?

Android - 完成 Activity 并退出应用程序

Android db onUpgrade 在 Release模式下不起作用

android - 以下应用程序使用哪种类型/类型的叠加/ float 小部件 : Facebook Messenger, MusixMatch、Link Bubble、LastPass

android - Gradle 访问同一文件中 `apply from: ' '` 的属性

css - 模态上的 Angular5 PrimeNG 数据表,上下文菜单显示在模态后面