Xamarin Forms Disposed Textview

非 Y 不嫁゛ 提交于 2019-12-24 02:33:06

问题


Been getting this exception a lot in my Xamarin Forms Project (android). The problem is that the stacktrace gives little information on how to reproduce, or where does it occur.

Xamarin caused by: android.runtime.JavaProxyThrowable: System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Xamarin.Forms.Platform.Android.FormsTextView'.
Java.Interop.JniPeerMembers.AssertSelf(IJavaPeerable self)<be2616b5140e4cbb8821649c795cfe62>:0
Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeNonvirtualVoidMethod(string encodedMember, IJavaPeerable self, JniArgumentValue* parameters)<be2616b5140e4cbb8821649c795cfe62>:0
Android.Widget.TextView.set_TextFormatted(ICharSequence value)<ec6bb63c41624773b5cc1eb2222982af>:0
Android.Widget.TextView.set_Text(string value)<ec6bb63c41624773b5cc1eb2222982af>:0
Xamarin.Forms.Platform.Android.LabelRenderer.UpdateText()<d572ae0ccf89437fad1de1370c623a06>:0
Xamarin.Forms.Platform.Android.LabelRenderer.OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)<d572ae0ccf89437fad1de1370c623a06>:0
<Module>.invoke_void_object_PropertyChangedEventArgs(object, PropertyChangedEventArgs)(wrapper delegate-invoke)
Xamarin.Forms.BindableObject.OnPropertyChanged(string propertyName)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.Element.OnPropertyChanged(string propertyName)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetValueActual(BindableProperty property, BindableObject.BindablePropertyContext context, object value, bool currentlyApplying, BindableObject.SetValueFlags attributes, bool silent)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetValueCore(BindableProperty property, object value, BindableObject.SetValueFlags attributes, BindableObject.SetValuePrivateFlags privateAttributes)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindingExpression.ApplyCore(object sourceObject, BindableObject target, BindableProperty property, bool fromTarget)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindingExpression.Apply(object sourceObject, BindableObject target, BindableProperty property)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.Binding.Apply(object newContext, BindableObject bindObj, BindableProperty targetProperty)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.ApplyBindings(object oldContext, bool skipBindingContext)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.ApplyBindings(object oldContext)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetInheritedBindingContext(BindableObject bindable, object value)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.Element.SetChildInheritedBindingContext(Element child, object context)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.Element.OnBindingContextChanged()<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.View.OnBindingContextChanged()<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetInheritedBindingContext(BindableObject bindable, object value)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.Element.SetChildInheritedBindingContext(Element child, object context)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.Element.OnBindingContextChanged()<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.Cell.OnBindingContextChanged()<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.BindingContextPropertyBindingPropertyChanged(BindableObject bindable, object oldvalue, object newvalue)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetValueActual(BindableProperty property, BindableObject.BindablePropertyContext context, object value, bool currentlyApplying, BindableObject.SetValueFlags attributes, bool silent)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetValueCore(BindableProperty property, object value, BindableObject.SetValueFlags attributes, BindableObject.SetValuePrivateFlags privateAttributes)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetValue(BindableProperty property, object value, bool fromStyle, bool checkAccess)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.SetValue(BindableProperty property, object value)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.BindableObject.set_BindingContext(object value)<7b0368eb3d0f405da776a09e3171532a>:0
Xamarin.Forms.TemplatedItemsList<TView, TItem>.<UnhookItem>d__140.MoveNext()<7b0368eb3d0f405da776a09e3171532a>:0
System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(object state)<67dcc9194d6a4f4f97ac27121b4304c3>:0
System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, object state, bool preserveSyncCtx)<67dcc9194d6a4f4f97ac27121b4304c3>:0
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, object state, bool preserveSyncCtx)<67dcc9194d6a4f4f97ac27121b4304c3>:0
System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()<67dcc9194d6a4f4f97ac27121b4304c3>:0
System.Threading.ThreadPoolWorkQueue.Dispatch()<67dcc9194d6a4f4f97ac27121b4304c3>:0
System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()<67dcc9194d6a4f4f97ac27121b4304c3>:0

回答1:


Here is the solution

Create a CustomLabel and CustomLabelRenderer

Your Renderer code in the Android project should look like...

public class CustomLabelRenderer: LabelRenderer
{
    protected override void OnAttachedToWindow()
    {
        try
        {
            base.OnAttachedToWindow();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    protected override void Dispose(bool disposing)
    {
        try
        {
            base.Dispose(disposing);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}

The solution is very hacky but it works for me 100%




回答2:


This issues mostly occur because of TextView / TextField inside ListView. If you have the same case you can change the CachingStrategy to RecycleElement.

Example:

 <ListView x:Name="AccountDetailsList"
                        StyleId="AccountDetailsListID"
                        CachingStrategy="RecycleElement"
                        ItemsSource="{Binding AccountDetails}"


来源:https://stackoverflow.com/questions/43389037/xamarin-forms-disposed-textview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!