由于ImageView绘图,Android ListView滚动延迟

由于ImageView绘图,Android ListView滚动延迟,android,android-listview,android-imageview,Android,Android Listview,Android Imageview,我有一个列表视图,显示从SD加载的图像(以前使用相机拍摄的JPG)。我使用了imageView.setImageBitmap(),因为图像太大,无法在列表中显示,而且消耗太多,所以我加载了一个带有inSampleSize的子采样版本 我的问题是在显示新行之前滚动会延迟。根据设备的不同,延迟或多或少。到达列表末尾后,滚动将变为流体 最初,我在ListAdapter getView()中执行位图解码: 然后我尝试在UI线程之外执行解码。我执行了一个AsyncTask来解码所有位图并将其缓存在内存中。

我有一个列表视图,显示从SD加载的图像(以前使用相机拍摄的JPG)。我使用了
imageView.setImageBitmap()
,因为图像太大,无法在列表中显示,而且消耗太多,所以我加载了一个带有
inSampleSize
的子采样版本

我的问题是在显示新行之前滚动会延迟。根据设备的不同,延迟或多或少。到达列表末尾后,滚动将变为流体

最初,我在ListAdapter getView()中执行位图解码:

然后我尝试在UI线程之外执行解码。我执行了一个
AsyncTask
来解码所有位图并将其缓存在内存中。所以在getView()中,我只做了
imageView.setImageBitmap()
。但我在滚动时看到了同样的延迟。使用DDMS中的方法分析工具,我看到Canvas.native_drawBitmap()方法导致延迟,因此问题不是位图解码,而是ImageView绘图


有什么办法解决这个问题吗??为什么第一次显示一行后,显示该行时不再有延迟?可能有一个ImageView显示缓存。

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

因此,解决方案是在rununuithread(runnable)处理程序中的SosetImageBitmap()。我面临这个问题。这就是解决办法

编辑:

这样做,

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();

滚动视图时,将调用列表适配器的getView()方法。这意味着,您向该方法加载的工作越多,延迟就越大。

因此,我们的目标是避免将滚动与
setImageBitmap()并行运行。
。?您的意思是将
setImageBitmap()
放入
处理程序中。postDelayed()
?因为
runOnUiThread()
handler.post()
在UI线程上中间运行,所以我已经测试了它,效果也是一样的。使用
handler.postDelayed(runnable,400)
滚动时,我看不到延迟(在野火上测试),但另一方面,加载图像的延迟有点高。我会继续测试。
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();