我有一个 ListView 显示从 SD 加载的图像(以前用相机拍摄的 JPG)。我使用imageView.setImageBitmap()
是因为图像太大而无法在列表中显示并且消耗太多(本机)内存,所以我使用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 显示缓存。