android中的Drawables资源管理

android中的Drawables资源管理,android,memory-management,drawable,Android,Memory Management,Drawable,我有一个问题。我在网站上快速搜索,但没有找到答案。 我们开发了运行安卓2.2及更高版本的应用程序。对于视图自定义,我们使用了许多可绘图项,其使用方式如下: <LinearLayout ... android:background="@drawable/some_drawable"/> 我们也使用地图,并在内存中处理许多数据,我们的应用程序受到了沉重的打击。在顶级设备上,它工作得很好,但在其他设备上,在使用应用程序几分钟后,我们遇到了OutOfMemory异常。看起来我们

我有一个问题。我在网站上快速搜索,但没有找到答案。 我们开发了运行安卓2.2及更高版本的应用程序。对于视图自定义,我们使用了许多可绘图项,其使用方式如下:

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

我们也使用地图,并在内存中处理许多数据,我们的应用程序受到了沉重的打击。在顶级设备上,它工作得很好,但在其他设备上,在使用应用程序几分钟后,我们遇到了OutOfMemory异常。看起来我们有内存泄漏。
我正在尝试减少我们应用程序的内存使用。问题,我们是否需要手动清理资源来销毁我们的活动:移除可拖动设备以供查看,还是系统为我们制作的?

我在我的应用程序中也遇到了这个问题<如果在活动中使用了大量位图,并进行缩放和/或其他位图操作,则会抛出代码>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 
        }
    }
}
@覆盖
受保护的空onDestroy()
{
super.ondestory();
//显式释放媒体播放器
if(viewObjectInfo!=null)
viewObjectInfo.releaseMediaPlayer();
//显式释放所有Drawable并调用GC
不可绑定的可提取文件(findViewById(R.id.main));
gc();
}
/**
*取消绑定给定视图(及其子树)中的所有可绘图项。
* 
*@param findviewbyd要解除绑定的树的根视图
*/
私有void未绑定可提取项(视图){
if(view.getBackground()!=null){
view.getBackground().setCallback(null);
}
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
未绑定的Drawables(((视图组)视图).getChildAt(i));
}
尝试
{
((视图组)视图);
}
捕获(不支持操作异常忽略)
{
//如果无法删除所有视图(例如适配器视图)-没有问题
}
}
}

我在我的应用程序中也遇到了这个问题<如果在活动中使用了大量位图,并进行缩放和/或其他位图操作,则会抛出代码>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 
        }
    }
}
@覆盖
受保护的空onDestroy()
{
super.ondestory();
//显式释放媒体播放器
if(viewObjectInfo!=null)
viewObjectInfo.releaseMediaPlayer();
//显式释放所有Drawable并调用GC
不可绑定的可提取文件(findViewById(R.id.main));
gc();
}
/**
*取消绑定给定视图(及其子树)中的所有可绘图项。
* 
*@param findviewbyd要解除绑定的树的根视图
*/
私有void未绑定可提取项(视图){
if(view.getBackground()!=null){
view.getBackground().setCallback(null);
}
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
未绑定的Drawables(((视图组)视图).getChildAt(i));
}
尝试
{
((视图组)视图);
}
捕获(不支持操作异常忽略)
{
//如果无法删除所有视图(例如适配器视图)-没有问题
}
}
}

如果您使用大量高分辨率位图/可绘制文件进行缩放,这将消耗大量内存。这些问题是否存在于特定活动中?可能是在哪个位置显示包含大量位图的listview?如果使用大量高分辨率的位图/绘图,将进行缩放,这将消耗大量内存。这些问题是否存在于特定活动中?可能在哪里显示包含大量位图的listview?
unbindDrawables(findViewById(R.id.main))
应该是
不可绑定的drawable(findViewById(R.layout.main))
?如果我想从版面中解除所有图像的绑定以释放资源,直到再次调用版面,该怎么办?@SiKni8对于您的第一条评论,我在
R.id.main
-您获得的是视图,而不是版面-尽管版面也可以工作。对于第二个问题,不要解除所有绑定-只需检查它是什么类型的视图。我的应用程序有一个问题,您可以帮助我。我认为:调用System.gc()是一种不好的做法;它不保证任何
不可绑定的属性(findviewbyd(R.id.main))
应该是
不可绑定的drawable(findViewById(R.layout.main))
?如果我想从版面中解除所有图像的绑定以释放资源,直到再次调用版面,该怎么办?@SiKni8对于您的第一条评论,我在
R.id.main
-您获得的是视图,而不是版面-尽管版面也可以工作。对于第二个问题,不要解除所有绑定-只需检查它是什么类型的视图。我的应用程序有一个问题,您可以帮助我。我认为:调用System.gc()是一种不好的做法;这不能保证什么