Xamarin Forms:System.ObjectDisposedException

时间:2017-11-23 12:25:48

标签: android ios xamarin xamarin.forms idisposable

当列表项的属性从另一个屏幕更改时,我得到一个ObjectDisposedException。 这是我的渲染器代码。

namespace SmartwebsCrossPlatform.CustomRenderers {
    public class GradientViewCellRenderer : ViewCellRenderer {
        View cellCore;

        protected override View GetCellCore( Cell item, View convertView, ViewGroup parent, Context context ) {
            cellCore = base.GetCellCore( item, convertView, parent, context );
            DirtyChanged();
            return cellCore;
        }

        protected override void OnCellPropertyChanged( object sender, PropertyChangedEventArgs e ) {
            base.OnCellPropertyChanged( sender, e );
            if (e.PropertyName == "IsDirty" )
                DirtyChanged();
        }

        void DirtyChanged(  ) {
            var viewCell = Cell as GradientViewCell;
            if( cellCore != null && viewCell != null) {
                int r = viewCell.IsDirty
                    ? Resource.Drawable.listViewGradientDirty
                    : Resource.Drawable.listViewGradient;
                try {
                    cellCore.SetBackgroundResource( r );
                } catch ( ObjectDisposedException ex ) {
                    Log.Warning( ex, "GradientViewCellRenderer.DirtyChanged" );
                }
            }
        }
    }
}

问题:如何检测是否已在DirtyChanged中处理了cellCore?

1 个答案:

答案 0 :(得分:0)

在线搜索后,我找不到检测IDisposable对象的好方法。

为了避免不必要的处置,我们可以尝试更改GC Bridges以查看它是否有效。

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

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

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