【问题标题】:Android ListView scroll delay due to ImageView drawing由于 ImageView 绘制,Android ListView 滚动延迟
【发布时间】: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


    【解决方案1】:

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

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

    编辑:

    这样做,

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

    【讨论】:

    • 所以目标是避免与setImageBitmap() 并行运行滚动。 ¿ 你的意思是把setImageBitmap() 放在handler.postDelayed() 中吗?因为runOnUiThread()handler.post()在UI线程上运行,我测试过,效果是一样的。使用handler.postDelayed(runnable, 400),我在滚动时看不到延迟(在野火上测试),但另一方面,加载图像的延迟有点高。我会继续测试。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多