我目前正在模拟器上测试我的应用程序,并注意到在我执行动画时发生了很多垃圾收集。
我担心所有这些垃圾收集可能没有必要。
我有一个自定义光标适配器:
public class AdapterCursorGrid extends CursorAdapter {
viewflipper
此适配器使用's填充网格项目。
要重新创建下面的调试,我执行以下操作:
- 单击第一
viewflipper
页上的项目 - 这会触发一个 onclick 侦听器并运行
holder.viewFlipper.showNext();
- 动画(长度 300 毫秒)开始播放,其中要么不存在,要么效果不佳
- 点击返回第二
viewflipper
页 - 这会触发一个 onclick 侦听器并运行
holder.viewFlipper.showPrevious();
- 一个动画(长度 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
有一个半复杂的布局,它由一个带有各种ImageView
s 和TextView
s 浮动的相对布局组成。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);
}
我的问题是:
- 为什么被
bindView
调用超过 1 次(在步骤 4 中被调用 3 次)? - 什么可能会创建所有 GC 调用?