【问题标题】:what does happen while recycling view in a listview?在列表视图中回收视图时会发生什么?
【发布时间】:2015-01-11 18:38:37
【问题描述】:

想知道android中listview的回收概念。在这里,我在每个列表项上使用带有图像和文本的列表视图。以下是我的疑惑,

1.listview中的list item回收时会发生什么?创建的对象(在getView()中)的内存是否被清除?

2.回收列表项时,为什么视图引用没有回收并添加到convertview?如果它在转换视图中,那么已经在列表项中加载的位图会发生什么。 listview是一直引用bitmap还是清空bitmap的内存?

【问题讨论】:

    标签: android listview android-listview bitmap


    【解决方案1】:

    1.listview中的list item回收时会发生什么?创建的对象(在getView()中)的内存是否被清除?

    您从getView() 返回的View 作为convertView 的另一个调用的参数传递给getView()

    是在重新配置行位置后返回它,还是返回一个新的View,由你决定。

    如果您自己没有对convertView 的引用并且不返回它,那么它就有资格进行垃圾回收,因为listview 本身只会保留对您从getView() 返回的视图的引用。

    2.回收列表项时,为什么视图引用没有回收并添加到convertview?

    我不知道你在这里问什么。

    如果它在转换视图中,已经加载到列表项中的位图会发生什么。 listview是一直引用bitmap还是清空bitmap的内存?

    Listview 不关心视图的内部结构。

    同样,如果您没有对任何视图或位图的引用,最终垃圾收集器会处理它们。

    【讨论】:

    • 嗨laalto,如果我重用convertview(它保存位图引用),堆内存会增加对吗?
    • 如果不泄漏内存(即不必要地持有引用),内存最终会被 GC 回收。
    • 感谢您的回复。我将开发像 Facebook 之类的应用程序(带有图像和文本的无限列表行)。这是否是重用 convertview 引用的好习惯?
    • 是的,非空时重用convertView,而不是创建新视图。
    • 谢谢。在列表视图中回收监听以避免堆大小增加时,我是否必须将位图引用设为空?。
    【解决方案2】:

    在列表视图中回收列表项时会发生什么?是否 创建的对象的内存(在 getView() 中)被清除了吗?

    如果您使用ViewHolder pattern,则不会从内存中清除对象。相同的View 对象将用于下一个数据项。

    在回收列表项时,为什么视图引用没有被回收 并添加到convertview?如果它在convertview中,会发生什么 已在列表项中加载的位图。 listview 是否保留 引用位图还是清空位图内存?

    要reccle View 引用,您需要使用ViewHolder 模式。已加载的 Bitmap 将一直存在,直到您更新/清除 ImageView

    【讨论】:

    • 视图持有者与视图回收没有任何关系。它只是用于优化的findViewById() 结果缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2011-12-07
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多