2016-11-15 85 views
1

我用ViewHolder模式由詹姆斯Montemagno使用ViewHolder模式时调用Dispose()的正确时机是什么?

https://blog.xamarin.com/creating-highly-performant-smooth-scrolling-android-listviews/

考虑通过FindViewById调用的对象所描述的,当我应该叫处置?什么是安全和正确的。我应该在某个时刻做到这一点: https://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/

要缩短对象的生命周期,Java.Lang.Object.Dispose()被调用。 t这将手动“切断”通过释放全局引用,因此允许对象 被收集越快 两个VM之间的对象上的连接。

+1

有你为什么被归结为'ListView'理由吗?请考虑使用https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html – CzarMatt

+0

真正Recyclerview需要一个较新的Android版本,如果我喜欢使用它没有(支持)库或其他附加依赖条件。 – Daan

回答

1

ListView已经很老了(Android 1.0)。它紧密耦合,并没有考虑到性能。需要大量的黑客来保持它的相关性。 RecyclerView填补了这一空白。

https://www.youtube.com/watch?v=LqBlYJTfLP4

至于什么时候你应该叫Dispose()RecyclerView应通过LayoutManager处理这种基本功能。在ViewHolder端,您可以按照基本Dispose模式:

protected override void Dispose (bool disposing) 
    { 
     base.Dispose (disposing); 
     if(ItemView != null) 
     { 
      ItemView.Click -= HandleClick; 
     } 
     _listener = null; //Listener might just be a simple Action<int> like in this example: https://github.com/xamarin/monodroid-samples/blob/master/android5.0/RecyclerViewer/RecyclerViewer/MainActivity.cs#L111 
    } 

中,你只在乎你处置设置基本和任何事件处理程序。但是,如果你RecyclerView使用比特在View它膨胀的图像,你会想,以确保您正确地管理这些资源为Android的GC将无法收集这些物品,因为他们将通过Xamarin.Android的GC引用(他们将是一个像几个字节值小的参考)。不知何故,你必须切断两个GC之间的联系,以便它有资格收集。你可以阅读更多有关GC算法在这里:Xamarin Android garbage collection algorithm和这里的原因:https://developer.xamarin.com/guides/cross-platform/deployment,_testing,_and_metrics/memory_perf_best_practices/#Use_Weak_References_to_Prevent_Immortal_Objects

要做到这一点,我们可以切断通过几个方面的关系:

  1. MyObject = null;
  2. MyObject.Dispose();

无论哪种方式都应该标记这些项目符合GC。在Drawable的情况下,你可能还希望设定各ImageView或对象的Drawable正被设置在到nullSetBackgroundDrawable /等。

TLDR;使用RecyclerView,并记得妥善管理任何Bitmap/Drawable资源。

+0

对于绘项目,你不再需要1获得ImageView的位图BM =((BitmapDrawable)iv.Drawable).Bitmap 2.设置可绘制的位图,以空 - iv.SetImageBitmap(NULL); 3.调用Bitmap的回收方法 - bm.Recycle(); ..已经有Bitmaps在堆中保持太久的问题。 – user1519979

相关问题