android - 使用缓存提高带有图像的 Android ListView 中的滚动性能

标签 android bitmap

我目前正在使用文件系统缓存来缓存我从服务器下载的图像。我有一个包含自定义 View 的 ListView,当调用 getView() 时,每个 View 都会从文件系统中检索其图像。

为了提高性能,我实现了一个 java.util.WeakHashMap<String,Bitmap>通过唯一的键存储每个位图。这允许我在下载图像时将它们塞入 HashMap 中,然后直接从内存中检索它们以填充我的 ListView 。这避免了文件 I/O 操作并带来更流畅的滚动体验。

这个想法是当操作系统内存不足时,它将清除 WeakHashMap 以释放内存。

但是,这不适用于 Android 2.3 或更早版本。问题是位图没有保存在 Java 堆中,而是保存在 native 内存中。这意味着 JVM 垃圾收集器不知道这些图像占用了多少内存,因此当操作系统的 native 内存不足时从不费心释放它们,从而在仍有大量内存可以回收时导致 OutOfMemory 错误。

这已在 Android 3.0 中修复,因为 3.0 将位图存储在 JVM 堆中而不是 native 内存中,但问题是我如何在 Android 2.3 及更高版本上轻松缓存位图而不会无意中导致不必要的 OutOfMemory 异常?

最佳答案

您可以尝试这样的操作:http://code.google.com/p/xlarge-demos/source/browse/trunk/PhotoAlbum/src/com/example/android/photoalbum/LruCache.java并在逐出步骤中显式recycle() 您的位图。

关于android - 使用缓存提高带有图像的 Android ListView 中的滚动性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6718855/

相关文章:

android - 如何从协程范围返回值

android - ImageView 中的位图在旋转后被裁剪

android - 尝试缩放图像并从 android gallery 返回位图

android - 降低android中位图的DPI分辨率

android - 无法在 Activity 中全屏显示日期选择器

android - 无法获取 Facebook 传入请求

java - 我如何检查动态线程是否结束

android - java.lang.OutOfMemoryError : bitmap size exceeds VM budget on line Drawable. createFromStream(((java.io.InputStream) new URL(url), "") 在android中

c++ - 在 C++ 中读取单色位图需要每隔一行读取一次?

php - 在 PHP/CSS 中动态创建的网格仅在 Android Firefox 浏览器中看起来不对?