【发布时间】:2013-12-16 06:13:27
【问题描述】:
我正在开发一个 Android 应用程序。该应用程序有一个列表视图,每个项目都包含要显示的图像。一个屏幕通常可以包含大约 3 个图像。我正在使用一些真实相机捕获的未压缩图像进行测试,每个图像大约 1.5M 左右。事实证明,滚动真的很慢而且卡住了。我想知道这是因为 Android 操作系统的实现,还是我的用法有误?
详情如下:
在 Listview 中,我有一个 ViewHolder 来保存所有项目实例,因此它比 findViewById 更快。在这个列表视图的活动加载时,我将旋转几个图像加载器 AsyncTasks 来帮助加载图像。我的图像加载器是作为单例实现的,并且有两级缓存。一级缓存是Map 的SoftReference:
private Map<String, SoftReference<Bitmap>> l1ImageCache =
new HashMap<String, SoftReference<Bitmap>>();
二级缓存是一个缓存文件夹。如果缓存无法命中,代码将执行异步下载并更新视图。整个 LoadImage 代码路径在我的 AsyncTask 实现中,并且是 UI 线程的一部分。
问题是,似乎缓存工作正常,并且图像加载非常快(从内存加载大约需要 10 毫秒),但滚动仍然卡住。
12-15 21:56:46.622: I/Choreographer(5803): Skipped 62 frames! The application may be doing too much work on its main thread.
如果我将图像从每个 1M 更改为每个 100K,图像视图变得非常流畅。
我想知道这是否是操作系统限制?还是有什么不对的地方?
【问题讨论】:
-
使用异步任务加载位图
-
在将图像添加到列表视图之前不能缩放图像吗??
-
您是否检查过Bitmap allocation 或Managing memory of bitmaps,如果没有,请查看此视频和Android 开发者视频下方的代码:“youtube.com/watch?v=rsQet4nBVi8”。
-
使用惰性加载器示例github.com/thest1/LazyList
标签: android listview caching android-listview android-asynctask