具有大图像的Listview非常慢

时间:2013-12-16 06:13:27

标签: android listview caching android-listview android-asynctask

我正在使用Android应用。该应用有一个列表视图,每个项目都包含要显示的图像。一个屏幕通常可以包含大约3个图像。我正在测试一些真正的相机捕获的未压缩图像,每个图像大约1.5M左右。事实证明,卷轴真的很慢并且卡住了。我想知道这是因为Android OS的实现,还是我的用法不对?

以下是详细信息:

在Listview中,我有一个ViewHolder来保存所有项目实例,因此它比执行findViewById更快。在此listview的活动加载时,我将旋转几个图像加载器AsyncTasks来帮助加载图像。我的图像加载器是作为单例实现的,并具有两级缓存。第一级缓存是Map的{​​{1}}:

SoftReference

,L2缓存是缓存文件夹。如果缓存无法命中,代码将执行异步下载并更新视图。整个LoadImage代码路径在我的AsyncTask实现中,并且是UI线程的一部分。

问题是,似乎缓存工作正常,图像加载非常快(从内存加载大约需要10毫秒),但滚动仍然卡住。

private Map<String, SoftReference<Bitmap>> l1ImageCache = 
        new HashMap<String, SoftReference<Bitmap>>();

如果我将图像从1M更改为每个100K,图像视图变得非常流畅。

我想知道这是否是操作系统限制?或者可能有任何错误?

1 个答案:

答案 0 :(得分:1)

此警告表示您的代码占用了大量处理时间/内存,因此Android会跳过粗略说几个计算(帧)。您正在做的事情可能会阻止旧智能手机执行您的代码。对于解决方案,您应该使用AsjuTasks移动UI线程的关键部分,如Arju所述。可以找到一个非常好的介绍here (Displaying Bitmaps Efficiently)。特别是当你声明你正在渲染“未压缩的真实相机捕获图像”时,你应该仔细阅读Loading Large Bitmaps Efficiently部分。在那里你会看到这些图像的实际内存分配比你想象的要大得多。最后但并非最不重要的是,如果您仍然遇到性能问题,请阅读Making ListView Scrolling Smooth

在使用LazyList或Android Universal Image Loader之类的第三方库之前,我认为要熟悉这些问题。