2016-11-15 8 views
1

Я использую шаблон ViewHolder, как описано Джеймсом MontemagnoКаков правильный момент вызова Dispose() при использовании шаблона ViewHolder?

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() должен быть вызван. TTh будет вручную «разорвать» соединение с объектом между двумя виртуальными машинами , освободив глобальную ссылку, что позволит быстрее собирать объекты .

+1

Есть ли причина, по которой вы отнесены к 'ListView'? Пожалуйста, рассмотрите возможность использования https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html – CzarMatt

+0

Реальная Recyclerview требует более новой версии для Android, если я предпочитаю использовать ее без (поддержки) библиотек или других дополнительных dependecies. – 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 не сможет собирать эти элементы, поскольку на них будет ссылаться GC GC Xamarin.Android (И они будет небольшая ссылка, например, на несколько байтов). Каким-то образом вам нужно разорвать связь между двумя 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 устанавливается в null, например SetBackgroundDrawable/etc.

TLDR; Используйте RecyclerView и не забудьте правильно управлять любыми Bitmap/Drawable ресурсами.

+0

Для чертежей, которые вам больше не нужны 1. Получите растровое изображение растрового изображения изображения bm = ((BitmapDrawable) iv.Drawable) .Bitmap 2. Установите Drawable в null - iv.SetImageBitmap (null); 3. вызвать метод Recycle Bitmap - bm.Recycle(); .. У вас уже была проблема, что растровые изображения слишком долго удерживались в куче. – user1519979

 Смежные вопросы

  • Нет связанных вопросов^_^