我有一個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顯示緩存。
所以我們的目標是避免與'setImageBitmap()'並行運行滾動。 ¿你的意思是把'setImageBitmap()'放在'handler.postDelayed()'中?使用'runOnUiThread()'和'handler.post()'在UI線程上運行,我測試了它,結果是一樣的。使用'handler.postDelayed(runnable,400)'滾動時,我看不到延遲(在Wildfire上測試),但在另一側,加載圖像的延遲有點高。我會繼續測試。 – 2012-08-16 11:17:59
我編輯了我的答案。嘗試使用dis代碼片段。 – Debarati 2012-08-16 12:47:35