Android中的Drawables资源管理

时间:2012-02-12 12:50:40

标签: android memory-management drawable

我有一个问题。我在网站上快速搜索,但没有找到答案。 我们开发运行Android 2.2及更高版本的应用程序。对于视图自定义,我们使用许多drawable,以这种方式使用:

<LinearLayout ...
    android:background="@drawable/some_drawable"/>

我们也使用地图并使用内存中的许多数据进行操作,我们的应用程序变得沉重。在顶级设备上,它工作得很好,但在其他设备上使用我们的应用程序几分钟后我们得到了OutOfMemory异常。看起来我们有内存泄漏。 我正在尝试减少应用程序的内存使用量。问题,我们是否需要在破坏我们的活动时手动清理资源:删除可绘制的视图,或系统为我们制作?

1 个答案:

答案 0 :(得分:3)

我也在我的应用中遇到过这个问题。如果在活动中使用了大量位图,并使用缩放和/或其他位图操作,则会抛出OutOfMemoryError。我所做的是将以下代码添加到我的活动中,这似乎使问题不那么频繁出现(它没有解决它的好处)并且应用程序现在在合理的低端手机上运行没有错误。

@Override
protected void onDestroy()
{
    super.onDestroy();
    // explicitly release media player
    if(viewObjectInfo != null)
        viewObjectInfo.releaseMediaPlayer();
    //explicitly release all drawables and call GC
    unbindDrawables(findViewById(R.id.main));
    System.gc();
}

/**
 * Unbinds all drawables in a given view (and its child tree).
 * 
 * @param findViewById     Root view of the tree to unbind
 */
private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }

    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        try
        {
            ((ViewGroup) view).removeAllViews();
        }
        catch(UnsupportedOperationException ignore)
        {
            //if can't remove all view (e.g. adapter view) - no problem 
        }
    }
}