SDからロードされた画像(以前にカメラで撮影されたJPG)を表示するListViewがあります。画像が大きすぎてリストに表示できず、 (ネイティブ)メモリimageView.setImageBitmap()
を消費しすぎるために使用します。そのため、サブサンプリングされたバージョンに。をロードします。inSampleSize
私の問題は、新しい行が表示される前にスクロールが遅れることです。デバイスに応じて、遅延は多かれ少なかれです。リストの最後に到達すると、スクロールが流動的になります。
もともと私はListAdaptergetView()でビットマップデコードを実行しました:
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があります。