3

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

4

2 回答 2

3

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

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

编辑 :

做这个,

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();
于 2012-08-16T10:08:34.573 回答
0

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

于 2012-08-16T14:20:28.677 回答