gpt4 book ai didi

Android ListView 滚动延迟由于 ImageView 绘制

转载 作者:太空狗 更新时间:2023-10-29 12:51:22 24 4
gpt4 key购买 nike

我有一个 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 显示缓存。

最佳答案

当您滚动列表时,它会在主线程 中动态加载。那时您正在尝试执行 setImageBitmap(),而这又会尝试在主线程 中执行。所以整个任务都变慢了。

所以解决方案就是在runOnUiThread(runnable)HandlersetImageBitmap()。我遇到了这个问题。这就是解决方案。

编辑:

这样做,

Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
// do setImageBitmap(bitmap)
}
};


new Thread() {
@Override
public void run() {
//get your bitmap
Message message = handler.obtainMessage(0, bitmap);
handler.sendMessage(message);
}
}.start();

关于Android ListView 滚动延迟由于 ImageView 绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11984662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com