Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 关于在适配器中延迟加载位图的共识(重点是Bitmap.recycle())_Android_Bitmap_Lazy Loading_Adapter_Recycle - Fatal编程技术网

Android 关于在适配器中延迟加载位图的共识(重点是Bitmap.recycle())

Android 关于在适配器中延迟加载位图的共识(重点是Bitmap.recycle()),android,bitmap,lazy-loading,adapter,recycle,Android,Bitmap,Lazy Loading,Adapter,Recycle,我看到很多关于这方面的建议,但没有一个(我发现的)考虑到所有因素,这些因素包括: 异步下载,不复制(下载程序和位图),取消下载/分配不会复制的图像 无论如何都需要更长的时间 一个适配器可以有多个相同ID的视图(对getView(0)的调用非常频繁) 不能保证视图不会丢失而不会被回收(考虑列表/网格视图的大小调整或文本过滤) 视图和数据/逻辑的分离(尽可能多) 没有为每次下载启动一个单独的线程(UI速度明显减慢)。使用队列/堆栈(LinkedBlockingQueue?)和线程池,或 诸如此类。。

我看到很多关于这方面的建议,但没有一个(我发现的)考虑到所有因素,这些因素包括:

  • 异步下载,不复制(下载程序和位图),取消下载/分配不会复制的图像 无论如何都需要更长的时间
  • 一个适配器可以有多个相同ID的视图(对getView(0)的调用非常频繁)
  • 不能保证视图不会丢失而不会被回收(考虑列表/网格视图的大小调整或文本过滤)
  • 视图和数据/逻辑的分离(尽可能多)
  • 没有为每次下载启动一个单独的线程(UI速度明显减慢)。使用队列/堆栈(LinkedBlockingQueue?)和线程池,或 诸如此类。。。。但如果活动被破坏,则需要终止该操作。
  • 清除距离列表/网格中当前位置足够远的位图,最好仅在需要内存时清除
  • 对要丢弃的每个位图调用recycle()。
  • 外部内存可能不可用(完全或始终),如果使用,应尽快清除(仅从此处下载的图像)。 还考虑Android的活动破坏/娱乐。
  • 正在更改的数据:删除条目(在列表中选择、要删除的按钮、立即刷新)并添加到后台线程(列表)中 按需刷新)。应保留已下载的位图,如下所示: 只要链接到的条目仍然存在。
  • (可选)不要依赖notifyDataSetChanged(afaik,它刷新所有可见的、可能非常复杂的列表项)来执行以下操作: 更新单个图像视图
  • setTextFilterEnabled(true)(如ArrayAdapter中所示。其Filterable的实现替换了其他适配器可见的数据数组 方法,从而更改视图的索引,使它们不能 用作链接到位图的ID)。
  • 可在ExpandableList中使用(影响缩略图的显示顺序)
  • 如果这个问题已经得到了回答,请原谅我。我已经搜索了几个月,但没有找到解决方案。

    这些要求对我来说似乎是合理的,但每一项都增加了难度,尤其是Bitmap.recycle,它需要在操作期间和活动销毁时调用(请注意,onDestroy,甚至onStop都可能不被调用)。
    这也排除了对软引用的依赖,因为软引用本可以解决其他一些问题。
    是的,这是必要的,否则即使在try-catch中进行了任意数量的gc、睡眠(20秒,偶数)、产量和巨大的数组分配(以强制控制内存不足的情况),我也会从内存错误中解脱出来。
    搜索“OutOfMemoryError:位图大小超过VM预算”或“android位图回收”。

    是的,我正在对位图进行重新采样。

    您能描述一下您希望在代码中实现什么吗?@alex我想要实现的是一个通用抽象适配器,它可以在任何ListView或GridView中使用,只需很少的更改,比如实现创建entryview的方法,下载位图并返回要更新的ImageView。例如,我希望添加ExpandableList方法很容易,因为在设计适配器时做出了一些假设,所以不需要修改映像管理。我不是要求为我编码适配器,只是为了一种如#5所述管理位图的机制,我们的异步dl机制实现“滥用”了
    AsyncTask
    类,它利用了已经可用的内部线程池,将图像作为进度更新发回&在活动请求之前不会退出。对于2+来说效果很好。仅供参考,“关闭为”-在异步的许多部分解决方案的上下文中,这一点很清楚。下载已经存在,但我想问题应该是独立的。澄清和澄清。很遗憾这个问题已经结束了。我不同意这不是一个真正的问题。这些仍然是问题,如果能将解决方案整合到一个地方,那就太好了。我不同意凯文的观点。