System.ObjectDisposedException:无法访问已处置的对象。对象名称:' Syncfusion.ListView.XForms.Android.ExtendedScrollViewRenderer'

时间:2017-11-18 17:53:27

标签: c# android xamarin.forms xamarin.android syncfusion

我有一个带有SyncFusion列表视图的Xamarin.Forms应用程序(SfListView)。它会导致Android上的频繁崩溃,并出现以下错误:

Unhandled exception: System.ObjectDisposedException: Cannot access a disposed object.
 Object name: 'Syncfusion.ListView.XForms.Android.ExtendedScrollViewRenderer'.
at Java.Interop.JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self) [0x00029] in <7cfbebb561c54efc9010b018c0846c7e>:0 
 at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualBooleanMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00000] in <7cfbebb561c54efc9010b018c0846c7e>:0 
 at Android.Views.View.get_IsLayoutRequested () [0x0000a] in <9ef29c909d7e4606a46b131129da3975>:0 
  at Xamarin.Forms.Platform.Android.ScrollViewRenderer+<OnScrollToRequested>d__58.MoveNext () [0x000ce] in D:\agent\_work\1\s\Xamarin.Forms.Platform.Android\Renderers\ScrollViewRenderer.cs:309 
 --- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <9ef29c909d7e4606a46b131129da3975>:0 
at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <9ef29c909d7e4606a46b131129da3975>:0 
at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00008] in <9ef29c909d7e4606a46b131129da3975>:0 
at (wrapper dynamic-method) System.Object:ab79b1ac-9c45-4d56-89ec-c42ce2376e50 (intptr,intptr)

我已经联系过SyncFusion,他们说这是一个框架问题。

将列表视图呈现到自定义选项卡式容器中。

与Xamarin.Forms 2.3到2.5(最新)一起使用,但问题仍然存在。 对此有何建议或想法?

3 个答案:

答案 0 :(得分:0)

您可以阅读:System.ObjectDisposedException: Cannot access a disposed object

解决方案1:

明确将CachingStrategy上的ListView设置为RecycleElement

解决方案2:

您可以尝试更改默认的Garbage Bridge收藏家。 Xamarin.Android默认为Tarjan,将其更改为new GC Bridge,然后重试:

  • environment.text项目中创建一个Xamarin.Android文件,BuildAction设置为AndroidEnvironment

  • 然后,您可以通过将GC_BRIDGEbridge-implementation=oldbridge-implementation=new传递给bridge-implementation=tarjan环境变量,指定您的应用应使用哪个MONO_GC_PARAMS选项

例如:

MONO_GC_PARAMS=bridge-implementation=new

然后重建并测试您的项目。

参考:

https://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/#GC_Bridge_Options

https://blog.xamarin.com/xamarin-android-garbage-collection-improvements/

答案 1 :(得分:0)

不是真正的解决方法,但我发现Task.Run( () => DoWork() ); 适用于ListView没有的情况 - 它只是为Andriod而崩溃。

所以我用它来解决这个问题:

SfListView

答案 2 :(得分:0)

可能this thread上有一个解决方案,只需检查注释即可。问题的根源似乎在于清除ObservableCollection列表的方式。代替使用.Clear()方法,您应该尝试将其分配给新列表:

所以代替:

ObservableCollectionProperty.Clear();

使用:

ObservableCollectionProperty = new ObservableCollection<TypeGoesHere>();

希望这会有所帮助,因为它似乎可以解决我所提供的链接中提到的自定义控件所面临的问题。