Search code examples
xamarinxamarin.formsxamarin.androidtelerik

Any idea what could be causing this java.util.concurrentModificationException from unmanaged code in Xamarin.Forms on Android?


I keep getting the following exception randomly from the Android project in my Xamarin.Forms application.

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)

It seems to be happening randomly and I am just hoping that someone has faced the same issue and has an idea on what to do? I am unable to debug as it comes from code that is unmanaged. Any thoughts on what could be causing this and any potential solutions would be much apppreciated.

Thanks


Solution

  • After much debugging it turns out it was related to having a Horizontally scrollable control (Telerik DataGrid) inside a vertically scrollable Layout (Scrollview) and then Trying to use ScrollToAsync() on Android when the an entry in the DataGrid is focused.

    To fix this, in my OnAppearing() override I checked that the Device.RuntimePlatform is Android and checked if the DataGrid Control should be visible by using the IsVisible Binding property from my view model and then removed it. This control is inside a grid so I was able to do this using the x:Names of the controls and calling .Children.Remove().

    And then used Device.RuntimePlatform to check if the device is Android and if it the ScrollToAsync() is not called.

    so the code looked something like:

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

    Note that MyGridControl and MyDataGridControl here are the X:Name properties of the controls.