由于垃圾收集,模拟器上的动画缓慢而且不稳定

时间:2013-03-08 13:21:04

标签: android garbage-collection android-cursoradapter

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

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

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

public class AdapterCursorGrid extends CursorAdapter {

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

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

  1. 点击第一个viewflipper页面上的项目
  2. 这会触发onclick侦听器并运行holder.viewFlipper.showNext();
  3. 一个动画(长度为300毫秒)踢,其中不存在或效果不佳
  4. 点击第二个viewflipper页面
  5. 这会触发onclick侦听器并运行holder.viewFlipper.showPrevious();
  6. 一个动画(长度为300毫秒)踢,如果不存在则非常不稳定。
  7. 调试如下所示:

    /* 
     * 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有一个半复杂的布局,其中包含各种ImageViewTextView s浮动的相对布局。 3 TextView s,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调用?

0 个答案:

没有答案