3

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があります。

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 に答える