2012-03-31 51 views
0

我有一个ListActivity,并在其中设置了我的列表项,并使用扩展SimpleCursorAdapter的类来设置我的列表项。我优先于bindView来设置我的Views。我有一些TextViewsImageViews。这是我如何设置我的光标适配器我的列表项:带有位图和垃圾回收问题的Android ListActivity问题

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 

我能做些什么来避免这种情况?这导致我的用户界面变得呆滞,并且我也滚动。

回答

1
  1. 您不需要加载位图来获取长度和宽度。你可能想看看ImageView的scaleType属性。这将根据加载的图像调整ImageView的边界。
  2. 您的代码暗示您具有基于数字的多个图像状态。你可能想看看这个LevelListDrawable XML。基本上,你可以设置一个按你传入的数字选择的可绘制列表。如果您将LevelListDrawable分配给XML或代码中的ImageView。你可能要做的就是致电imageView.setImageLevel(num)

bindView是动画列表的关键方法。当ListView被滚动并且新项目被加载时,它会被调用,因为它们正在出现。 bindView在UI线程上被调用,这意味着动画无法继续直到完成。通常这不是问题,因为你只是分配变量。在这个代码中,你打电话Bitmap b = BitmapFactory.decodeResource(context.getResources(), imageResource);,它必须打开昂贵的NAND闪存。顺便说一下,您可以使用StrictMode来检测这些类型的问题。

位图不再使用时会从内存中卸载,但它不是直接的,GC必须被调用。 Android提供了一种方法来删除位图用Bitmap.recycle()方法携带的大字节数组数据。这将有望解决OutOfMemoryError's

如果上述方法由于某种原因不起作用,那么您将不得不处理涉及线程和回调的更复杂的解决方案。

让我知道你是否需要帮助。如果你能说清楚为什么你需要图像的宽度和高度?

+0

为了清楚起见,我应该添加清单,在列表中我将width和height设置为half(不在上面的代码中),并在另一个activity中使用相同的资源。我会尝试'recycle()'调用,看看是否有帮助。 – chis54 2012-04-01 18:16:13

+0

而且,是的,我有多个不同的图像列表元素。 – chis54 2012-04-01 18:18:26

+0

尝试imageView.getDrawable()。getIntrinsicWidth()和Height然后。您可能想重新考虑您的设计列表中不同大小的元素会导致其他问题,如snakey滚动条。添加一个截图,这将有所帮助。 – 2012-04-01 18:36:30