2017-11-23 4 views
0

목록 항목의 속성이 다른 화면에서 변경되면 ObjectDisposedException이 발생합니다. 내 렌더러 코드는 다음과 같습니다.Xamarin Forms : 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"); 
       } 
      } 
     } 
    } 
} 

질문 : cellCore가 DirtyChanged에 삭제되었는지 어떻게 알 수 있습니까?

답변

0

온라인 검색 후 IDisposable 개체를 감지하는 좋은 방법을 찾지 못했습니다.

불필요한 처분을 피하기 위해 GC 브릿지를 변경하여 작동하는지 확인할 수 있습니다.

  • AndroidEnvironmentBuildAction 세트와 Xamarin.Android 프로젝트 내에서 environment.text 파일을 만듭니다.
  • 그런 다음 당신은 당신의 응용 프로그램이 MONO_GC_PARAMS 환경 변수에 bridge-implementation=old, bridge-implementation=new, 또는 bridge-implementation=tarjan를 전달하여 사용해야하는 GC_BRIDGE 옵션을 지정할 수 있습니다. https://blog.xamarin.com/xamarin-android-garbage-collection-improvements/

참조