2017-11-23 4 views
0

Ich erhalte eine ObjectDisposedException, wenn die Eigenschaft eines Listenelements von einem anderen Bildschirm geändert wird. Hier ist mein Renderer-Code.Xamarin Formulare: System.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"); 
       } 
      } 
     } 
    } 
} 

Frage: Wie erkenne ich, ob CellCore in DirtyChanged entsorgt wurde?

Antwort

0

Nach der Online-Suche fand ich keine gute Möglichkeit, ein IDisposable Objekt zu erkennen.

Um unnötige Entsorgung zu vermeiden, können wir versuchen, die GC Bridges zu ändern, um zu sehen, ob es funktioniert.

  • erstellen environment.text Datei in Ihrem Xamarin.Android Projekt mit dem BuildAction Satz AndroidEnvironment.

  • Dann können Sie festlegen, welche GC_BRIDGE Option Ihre Anwendung, indem bridge-implementation=old, bridge-implementation=new oder bridge-implementation=tarjan zum MONO_GC_PARAMS Umgebungsvariable verwendet werden soll.

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