2

我目前正在模拟器上测试我的应用程序,并注意到在我执行动画时发生了很多垃圾收集。

我担心所有这些垃圾收集可能没有必要。

我有一个自定义光标适配器:

public class AdapterCursorGrid extends CursorAdapter {

viewflipper此适配器使用's填充网格项目。

要重新创建下面的调试,我执行以下操作:

  1. 单击第一viewflipper页上的项目
  2. 这会触发一个 onclick 侦听器并运行holder.viewFlipper.showNext();
  3. 动画(长度 300 毫秒)开始播放,其中要么不存在,要么效果不佳
  4. 点击返回第二viewflipper
  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有一个半复杂的布局,它由一个带有各种ImageViews 和TextViews 浮动的相对布局组成。3TextView秒,2/3 ImageViews

一个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调用超过 1 次(在步骤 4 中被调用 3 次)?
  2. 什么可能会创建所有 GC 调用?
4

0 回答 0