我有ListActivity
,其中我使用扩展SimpleCursorAdapter
的类设置列表项。我正在覆盖bindView
来设置我的Views
。我有一些TextViews
和ImageViews
。这是我在游标适配器中设置列表项的方法:
String variableName = "drawable/q" + num + "_200px";
int imageResource = context.getResources().getIdentifier(variableName, "drawable", context.getPackageName());
if (imageResource != 0 ) {
// The drawable exists
Bitmap b = BitmapFactory.decodeResource(context.getResources(), imageResource);
width = b.getWidth();
height = b.getHeight();
imageView.getLayoutParams().width = (int) (width);
imageView.getLayoutParams().height = (int) (height);
imageView.setImageResource(imageResource);
} else {
imageView.setImageResource(R.drawable.25trans_200px);
}
我遇到的问题是每当我用setListAdapter
更新我的列表时,我都会收到大量的垃圾回收:
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 125K, 51% free 2710K/5447K, external 2022K/2137K, paused 75ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 30K, 51% free 2701K/5447K, external 2669K/2972K, paused 64ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 23K, 51% free 2713K/5447K, external 3479K/3579K, paused 53ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 22K, 51% free 2706K/5447K, external 3303K/3352K, paused 64ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 21K, 51% free 2722K/5447K, external 3569K/3685K, paused 102ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 23K, 50% free 2755K/5447K, external 3499K/3605K, paused 65ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 23K, 50% free 2771K/5447K, external 4213K/4488K, paused 53ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 18K, 49% free 2796K/5447K, external 5057K/5343K, paused 75ms
D/dalvikvm(18637): GC_EXTERNAL_ALLOC freed 28K, 49% free 2803K/5447K, external 5944K/5976K, paused 53ms
D/dalvikvm( 435): GC_EXPLICIT freed 6K, 54% free 2544K/5511K, external 1625K/2137K, paused 50ms
D/dalvikvm( 165): GC_EXPLICIT freed 85K, 52% free 2946K/6087K, external 4838K/5980K, paused 111ms
D/dalvikvm( 448): GC_EXPLICIT freed 1K, 54% free 2540K/5511K, external 1625K/2137K, paused 50ms
D/dalvikvm( 294): GC_EXPLICIT freed 8K, 55% free 2598K/5703K, external 1625K/2137K, paused 64ms
我该怎么做才能避免这种情况?它导致我的UI缓慢,当我滚动时。
答案 0 :(得分:1)
bindView是动画列表时的关键方法。滚动ListView时会调用它,并且因为它们正在出现而加载了新项目。在UI线程上调用bindView,这意味着动画在完成之前无法继续。通常这不是问题,因为您只是分配变量。在这段代码中,你打电话给Bitmap b = BitmapFactory.decodeResource(context.getResources(), imageResource);
,它必须打到昂贵的NAND闪存。顺便说一句,您可以使用StrictMode来检测这些类型的问题。
当不再使用时,位图会从内存中卸载,但它不是立即的,GC必须被调用。 Android提供了一种使用Bitmap.recycle()方法删除位图携带的大字节数组数据的方法。这有望解决OutOfMemoryError's
。
如果上述方法由于某种原因不起作用,那么您将不得不处理涉及线程和回调的更复杂的解决方案。
如果您需要帮助,请告诉我。如果可以请说明为什么需要图像的宽度和高度?