【问题标题】:Any idea what could be causing this java.util.concurrentModificationException from unmanaged code in Xamarin.Forms on Android?知道什么可能导致 Android 上 Xamarin.Forms 中的非托管代码出现此 java.util.concurrentModificationException 吗?
【发布时间】:2021-12-06 00:40:50
【问题描述】:

我不断从我的 Xamarin.Forms 应用程序的 Android 项目中随机收到以下异常。

java.util.ConcurrentModificationException: 
  at java.util.ArrayList$Itr.next (ArrayList.java:860)
  at com.telerik.widget.primitives.panels.RadScrollView.notifyLaidOutListeners (RadScrollView.java:153)
  at com.telerik.widget.primitives.panels.RadScrollView.onLayout (RadScrollView.java:2092)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at crc643f46942d9dd1fff9.ViewRenderer_2.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.ViewRenderer_2.onLayout (ViewRenderer_2.java:47)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.onLayout (Platform_DefaultRenderer.java:72)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.onLayout (Platform_DefaultRenderer.java:72)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.onLayout (Platform_DefaultRenderer.java:72)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc64ee486da937c010f4.FrameRenderer.n_onLayout (Native Method)
  at crc64ee486da937c010f4.FrameRenderer.onLayout (FrameRenderer.java:47)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.onLayout (Platform_DefaultRenderer.java:72)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.onLayout (Platform_DefaultRenderer.java:72)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc643f46942d9dd1fff9.ScrollViewContainer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.ScrollViewContainer.onLayout (ScrollViewContainer.java:46)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:270)
  at androidx.core.widget.NestedScrollView.onLayout (NestedScrollView.java:1854)
  at crc643f46942d9dd1fff9.ScrollViewRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.ScrollViewRenderer.onLayout (ScrollViewRenderer.java:91)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.Platform_DefaultRenderer.onLayout (Platform_DefaultRenderer.java:72)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc643f46942d9dd1fff9.PageRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.PageRenderer.onLayout (PageRenderer.java:72)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc64720bb2db43a66fe9.NavigationPageRenderer.n_onLayout (Native Method)
  at crc64720bb2db43a66fe9.NavigationPageRenderer.onLayout (NavigationPageRenderer.java:65)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at com.xamarin.forms.platform.android.FormsViewGroup.measureAndLayout (FormsViewGroup.java:37)
  at crc64720bb2db43a66fe9.MasterDetailContainer.n_onLayout (Native Method)
  at crc64720bb2db43a66fe9.MasterDetailContainer.onLayout (MasterDetailContainer.java:46)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at androidx.drawerlayout.widget.DrawerLayout.onLayout (DrawerLayout.java:1231)
  at crc64720bb2db43a66fe9.MasterDetailPageRenderer.n_onLayout (Native Method)
  at crc64720bb2db43a66fe9.MasterDetailPageRenderer.onLayout (MasterDetailPageRenderer.java:68)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at crc643f46942d9dd1fff9.PlatformRenderer.n_onLayout (Native Method)
  at crc643f46942d9dd1fff9.PlatformRenderer.onLayout (PlatformRenderer.java:55)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.widget.RelativeLayout.onLayout (RelativeLayout.java:1103)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:270)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:270)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:270)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1829)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1673)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1582)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:270)
  at com.android.internal.policy.DecorView.onLayout (DecorView.java:1225)
  at android.view.View.layout (View.java:24475)
  at android.view.ViewGroup.layout (ViewGroup.java:7383)
  at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:4260)
  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:3695)
  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:2618)
  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:9971)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1010)
  at android.view.Choreographer.doCallbacks (Choreographer.java:809)
  at android.view.Choreographer.doFrame (Choreographer.java:744)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:995)
  at android.os.Handler.handleCallback (Handler.java:938)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:246)
  at android.app.ActivityThread.main (ActivityThread.java:8538)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)

这似乎是随机发生的,我只是希望有人遇到过同样的问题并知道该怎么做?我无法调试,因为它来自非托管代码。对于可能导致此问题的任何想法以及任何潜在的解决方案,我们将不胜感激。

谢谢

【问题讨论】:

  • 基于此线程 stackoverflow.com/a/20402878/4778712 你这样做了吗?
  • 这个异常不是来自我的代码。它似乎来自非托管代码。我的代码中没有这样的 for 循环。
  • 你用的是什么 XF 版本?
  • 我使用 Xamarin 表单 5.0.0.2196
  • 尝试添加这个库Xamarin.AndroidX.RecyclerView

标签: xamarin xamarin.forms xamarin.android telerik


【解决方案1】:

由于你只提供错误信息,从错误信息来看,这个错误一般出现在ArrayList的迭代中。

主要原因是调用list.remove()方法导致modCountexpectedModCount的值不一致。

如果使用迭代器,可以通过直接调用Iterator.remove()来避免这个错误。

如果只是调用API没有其他操作,应该是内部接口类似的问题。

【讨论】:

  • 不幸的是,问题来自非托管代码,因此我没有太多控制权。话虽如此,经过大量调试后发现它与在垂直可滚动布局 (scrollview) 中具有 水平可滚动控件 (Telerik DataGrid) 有关。因此,在我的 OnAppearing 覆盖中,我刚刚检查了 Android 平台,如果 isVisibleProperty(该属性在我的视图模型中绑定)应该设置为 false,则删除了此控件。这为我解决了问题
【解决方案2】:

经过大量调试,事实证明它与在 垂直可滚动布局 (Scrollview) 内具有 可水平滚动控件 (Telerik DataGrid) 然后尝试使用 ScrollToAsync() 在 Android 上,当 DataGrid 中的条目获得焦点时。

为了解决这个问题,在我的 OnAppearing() 覆盖中,我检查了 Device.RuntimePlatform 是 Android 并检查了 DataGrid Control 是否应该通过使用我的视图模型中的 IsVisible Binding 属性可见,然后将其删除。该控件位于网格内,因此我可以使用控件的 x:Names 并调用 .Children.Remove() 来执行此操作。

然后使用Device.RuntimePlatform检查设备是否为Android,如果是则ScrollToAsync()没有被调用。

所以代码看起来像:

var vm = BindingContext as MyViewModelName;
if (Device.RuntimePlatform == Device.Android && !vm.DataGridIsVisible){
    MyGridControl.Children.Remove(MyDataGridControl);
}

注意这里的MyGridControlMyDataGridControl 是控件的X:Name 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 2023-01-12
    • 2012-01-15
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2022-07-26
    • 2010-09-15
    相关资源
    最近更新 更多