2012-08-16 46 views
3

我有一個ListView,顯示從SD(以前用相機拍攝的JPG)加載的圖像。我使用imageView.setImageBitmap(),因爲圖像太大而無法在列表中顯示,並且消耗太多(native) memory,所以我加載了一個帶有inSampleSize的二次採樣版本。由於ImageView繪圖造成的Android ListView滾動延遲

我的問題是滾動延遲之前,一個新的行將被顯示。取決於設備,延遲或多或少。一旦你到達最後的名單,滾動變得流暢。

本來我在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顯示緩存。

回答

3

當你滾動列表時,它的動態加載在主線程。那時你正在試圖做setImageBitmap()這又是在主線程中做的。所以整個任務都放慢了。

因此該解決方案是這樣setImageBitmap()runOnUiThread(可運行)處理程序。我面臨這個問題。這是解決方案。

編輯:

做到這一點,

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

所以我們的目標是避免與'setImageBitmap()'並行運行滾動。 ¿你的意思是把'setImageBitmap()'放在'handler.postDelayed()'中?使用'runOnUiThread()'和'handler.post()'在UI線程上運行,我測試了它,結果是一樣的。使用'handler.postDelayed(runnable,400)'滾動時,我看不到延遲(在Wildfire上測試),但在另一側,加載圖像的延遲有點高。我會繼續測試。 – 2012-08-16 11:17:59

+0

我編輯了我的答案。嘗試使用dis代碼片段。 – Debarati 2012-08-16 12:47:35

0

滾動時你看來,你的清單適配器的getView()方法被調用。這意味着,您爲此方法加載的工作量越多,延遲時間越長。