XamarinCommunityToolkit icon indicating copy to clipboard operation
XamarinCommunityToolkit copied to clipboard

[Bug] Access to disposable object on Android ShadowEffect

Open brakonier946 opened this issue 3 years ago • 2 comments

Hello, I catch exception when using ShadowEffect.

[mono-rt] [ERROR] FATAL UNHANDLED EXCEPTION: System.ObjectDisposedException: Cannot access a disposed object. [mono-rt] Object name: 'Xamarin.Forms.Platform.Android.ImageButtonRenderer'. [mono-rt] at Java.Interop.JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self) [0x00029] in <1959115d56f8444789986cf39185638c>:0 [mono-rt] at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00000] in <1959115d56f8444789986cf39185638c>:0 [mono-rt] at Android.Views.View.set_Elevation (System.Single value) [0x00018] in /Users/builder/azdo/_work/2/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Android.Views.View.cs:6590 [mono-rt] at Xamarin.CommunityToolkit.Android.Effects.PlatformShadowEffect.OnDetached () [0x0000f] in <964de25b16794d918e4c00220cf2f406>:0 [mono-rt] at Xamarin.Forms.Effect.SendDetached () [0x00009] in D:\a\1\s\Xamarin.Forms.Core\Effect.cs:62 [mono-rt] at Xamarin.Forms.PlatformEffect2[TContainer,TControl].SendDetached () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\PlatformEffect.cs:23 [mono-rt] at Xamarin.Forms.RoutingEffect.SendDetached () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\RoutingEffect.cs:34 [mono-rt] at Xamarin.Forms.Element.set_EffectControlProvider (Xamarin.Forms.IEffectControlProvider value) [0x0002e] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:230 [mono-rt] at Xamarin.Forms.Internals.EffectUtilities.RegisterEffectControlProvider (Xamarin.Forms.IEffectControlProvider self, Xamarin.Forms.IElementController oldElement, Xamarin.Forms.IElementController newElement) [0x0001a] in D:\a\1\s\Xamarin.Forms.Core\Internals\EffectUtilities.cs:16 [mono-rt] at Xamarin.Forms.Platform.Android.FastRenderers.VisualElementRenderer.OnElementChanged (System.Object sender, Xamarin.Forms.Platform.Android.VisualElementChangedEventArgs e) [0x0005c] in D:\a\1\s\Xamarin.Forms.Platform.Android\FastRenderers\VisualElementRenderer.cs:102 [mono-rt] at (wrapper delegate-invoke) System.EventHandler1[Xamarin.Forms.Platform.Android.VisualElementChangedEventArgs].invoke_void_object_TEventArgs(object,Xamarin.Forms.Platform.Android.VisualElementChangedEventArgs) [mono-rt] at Android.Views.View.set_Elevation (System.Single value) [0x00018] in /Users/builder/azdo/_work/2/s/xamarin-android/src/Mono.Android/obj/10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.ImageButtonRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs1[TElement] e) [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\AppCompat\ImageButtonRenderer.cs:198 [mono-rt] at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context) [0x0003e] in D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:358 [mono-rt] at Xamarin.Forms.Internals.EffectUtilities.RegisterEffectControlProvider (Xamarin.Forms.IEffectCon10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000b3] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:140 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.Load () [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:112 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetElement (TElement element) [0x000e8] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:244 [mono-rt] at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context) [0x0003e] in D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:358 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000b3] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:140 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualEleme10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement) [0x00163] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:351 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) 10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) [0x00007] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:481 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetElement (TElement element) [0x000e8] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:244 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00033] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:131 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000b3] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:140 [mono-rt] at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.Visu10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementPackager.OnChildAdded (System.Object sender, Xamarin.Forms.ElementEventArgs e) [0x0000f] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:206 [mono-rt] at Xamarin.Forms.Element.OnChildAdded (Xamarin.Forms.Element child) [0x0000f] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:328 [mono-rt] at Xamarin.Forms.VisualElement.OnChildAdded (Xamarin.Forms.Element child) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\VisualElement.cs:832 [mono-rt] at System.Collections.ObjectModel.ObservableCollection1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Layout1[T].OnChildAdded (Xamarin.Forms.Element child) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:22 [mono-rt] at Xamarin.Forms.Layout.OnInternalAdded (Xamarin.Forms.View view) [0x0001d] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:444 [mono-rt] at Xamarin.Forms.Layout.InternalChildrenOnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00080] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:434 [mono-rt] at (wrapper delegate-invoke) <Module>.invoke_void_object_NotifyCollectionChangedEventArgs(object,System.Collections.Specialized.NotifyCollectionChangedEventArgs) [mono-rt] at System.Collections.ObjectModel.Collection1[T].Add (T 0x00018] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:263 [mono-rt] at System.Collections.ObjectModel.ObservableCollection1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:338 [mono-rt] at System.Collections.ObjectModel.ObservableCollection1[T].InsertItem (System.Int32 index, T item) [0x0001a] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:196 [mono-rt] at System.Collections.ObjectModel.Collection1[T].Add (T item) [0x00020] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Collections/ObjectModel/Collection.cs:71 [mono-rt] at Xamarin.Forms.ObservableWrapper`2[TTrack,TRestrict].Add (TRestrict item) [0x0004b] in D:\a\1\s\Xamarin.Forms.Core\ObservableWrapper.cs:35 [mono-rt] at Xamarin.CommunityToolkit.UI.Views.StateLayoutController.SwitchToTemplate (Xamarin.CommunityToolkit.UI.Views.LayoutState state, System.String customState, System.Boolean animate) [0x0034d] in <964de25b16794d918e4c00220cf2f406>:0 [mono-rt] at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.40(intptr,intptr) [mono-rt] at (wrapper native-to-managed) Android.Runtime.DynamicMethodNameCounter.40(intptr,intptr)

brakonier946 avatar Oct 22 '21 21:10 brakonier946

Do you have any sample repo to reproduce it easily? Diagnosing the issue with only exception is bit hard.

codeanees avatar Nov 13 '21 02:11 codeanees

Hi,

I have the same problem on my app. It looks like. Problem is here:

OnDeatach is trying to set Elevation on already Disposed object:

System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Xamarin.Forms.Platform.Android.ImageButtonRenderer'.

Partial Stack Trace:

JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self)
JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters)
View.set_Elevation (System.Single value)
PlatformShadowEffect.OnDetached ()
Effect.SendDetached ()
PlatformEffect`2[TContainer,TControl].SendDetached ()
RoutingEffect.SendDetached ()

Problem is on this class: public class PlatformShadowEffect : PlatformEffect

Additional check for disposed object may/should resolve the problem.

protected override void OnDetached()
{
    if (View == null)
        return;
    View.Elevation = 0;
}

CleverSoftwarePoland avatar Jul 13 '22 14:07 CleverSoftwarePoland