2

現在、エミュレーターでアプリをテストしていますが、アニメーションの実行中に多くのガベージ コレクションが行われていることに気付きました。

このすべてのガベージ コレクションが必要ないのではないかと懸念しています。

カスタムカーソルアダプターがあります:

public class AdapterCursorGrid extends CursorAdapter {

このアダプタは、グリッド アイテムに を入力しviewflipperます。

以下のデバッグを再作成するには、次のようにします。

  1. viewflipper最初のページの項目をクリックします
  2. これにより、onclick リスナーが起動され、実行されますholder.viewFlipper.showNext();
  3. アニメーション (長さ 300 ミリ秒) が開始され、存在しないか、うまく機能しません。
  4. viewflipper2ページ目に戻る
  5. これにより、onclick リスナーが起動され、実行されますholder.viewFlipper.showPrevious();
  6. アニメーション (長さ 300 ミリ秒) が開始されますが、存在しない場合は非常に不安定です。

デバッグは次のように表示されます。

/* 
 * Step 1. Click an item on the first `viewflipper` page
 */
D/dalvikvm(15415): GC_FOR_ALLOC freed 1628K, 20% free 11041K/13767K,    paused 74ms    
D/dalvikvm(15415): GC_CONCURRENT freed 3K, 16% free 11662K/13767K, paused 6ms+16ms    
D/dalvikvm(15415): GC_CONCURRENT freed 454K, 13% free 12081K/13767K, paused 45ms+6ms

/* 
 * Step 4. Click back on second `viewflipper` page
 */
I/ContentManager(15415): Update() record
I/AdapterCursorGrid(15415): bindView()
D/dalvikvm(15415): GC_FOR_ALLOC freed 1448K, 19% free 11237K/13767K, paused 69ms
D/dalvikvm(15415): GC_CONCURRENT freed 6K, 14% free 11855K/13767K, paused 8ms+11ms
I/AdapterCursorGrid(15415): bindView()
D/dalvikvm(15415): GC_CONCURRENT freed 454K, 11% free 12274K/13767K, paused 14ms+10ms
D/dalvikvm(15415): GC_FOR_ALLOC freed 1241K, 19% free 11231K/13767K, paused 142ms
D/dalvikvm(15415): GC_CONCURRENT freed 1K, 14% free 11855K/13767K, paused 7ms+7ms
D/dalvikvm(15415): GC_CONCURRENT freed 455K, 11% free 12274K/13767K, paused 5ms+12ms
I/AdapterCursorGrid(15415): bindView()
D/dalvikvm(15415): GC_FOR_ALLOC freed 1242K, 19% free 11232K/13767K, paused 69ms
D/dalvikvm(15415): GC_CONCURRENT freed 1K, 14% free 11855K/13767K, paused 5ms+5ms
D/dalvikvm(15415): GC_CONCURRENT freed 455K, 11% free 12274K/13767K, paused 5ms+12ms

デバッグから、ステップ 4 で更新を実行していることがわかります。これは、コンテンツ プロバイダーへの呼び出しであり、UI スレッドから実行されます。

最後に、 には、さまざまなとが浮かんviewflipperでいる相対的なレイアウトで構成される半複雑なレイアウトがあります。3秒、2/3 .ImageViewTextViewTextViewImageViews

ImageViewに入力される例はbindView次のとおりです。

/*
 * Set picture
 */
int pictureColumnIndex = cursor.getColumnIndex(MyTable.TABLE_COLUMN_PICTURE);
byte[] picture = cursor.getBlob(pictureColumnIndex);
Bitmap bitmapPicture = null;
if (!cursor.isNull(pictureColumnIndex) && picture.length > 0) {

    InputStream inputStream = new ByteArrayInputStream(picture);
    bitmapPicture = BitmapFactory.decodeStream(inputStream);
    bitmapPicture = ImageUtils.scaleBitmap(context,bitmapPicture,ConversionUtils.convertDpToPixels(context, mResources.getDimension(R.dimen.grid_item_width_pic_resize)));
    bitmapPicture = ImageUtils.roundedBitmapCorners(bitmapPicture, ConversionUtils.convertDpToPixels(context, 2));

    holder.imageViewPicture.setImageDrawable(new BitmapDrawable(bitmapPicture));
} else {
    holder.imageViewPicture.setImageDrawable(null);
}

私の質問は次のとおりです。

  1. bindViewが複数回呼び出されるのはなぜですか(ステップ 4 で 3 回呼び出されます)。
  2. すべての GC 呼び出しを作成しているのは何ですか?
4

0 に答える 0