【发布时间】:2012-08-16 09:51:48
【问题描述】:
我有一个 ListView,它显示从 SD 加载的图像(以前用相机拍摄的 JPG)。我使用imageView.setImageBitmap(),因为图像太大而无法在列表中显示并且消耗太多(native) memory,所以我使用inSampleSize加载了一个子采样版本。
我的问题是在显示新行之前滚动延迟。根据设备的不同,延迟或多或少。一旦你到达列表的末尾,滚动就会变得流畅。
原来我在ListAdapter getView()中进行位图解码:
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inSampleSize = 2; //Subsample the original image
bitmapOptions.inPurgeable = true; //The system can free the ¿native? memory allocated by the bitmap if needed
bitmapOptions.inInputShareable = true; //Works in conjuction with inPurgeable
bitmap = BitmapFactory.decodeFile(path, bitmapOptions);
imageView.setImageBitmap(bitmap);
然后我尝试在 UI 线程之外执行解码。我执行了AsyncTask 来解码所有位图并将其缓存在内存中。所以在 getView() 中我只做了imageView.setImageBitmap()。但是我在滚动时看到了同样的延迟。使用DDMS中的方法分析工具我看到方法Canvas.native_drawBitmap()导致延迟,所以问题不是位图解码,而是ImageView绘图。
¿有解决此问题的想法吗? ¿ 为什么第一次显示一行后显示该行时没有延迟?也许有一个 ImageView 显示缓存。
【问题讨论】:
标签: android android-listview android-imageview