2012-02-12 210 views
0

我有一个问题。我在网站上进行了快速搜索,但没有找到答案。 我们开发运行Android 2.2及更高版本的应用程序。对于视图定制我们使用许多图形内容,在这样的方式使用:android中的可绘制资源管理

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

我们使用地图也与在存储许多数据处理和我们的应用程序有一个沉甸甸的。在顶级设备上,它的工作非常棒,但在另一些设备上,我们在使用我们的应用程序几分钟后就发现了OutOfMemory异常。这看起来像我们有内存泄漏。 我试图减少我们的应用程序的内存使用情况。问题,我们是否需要人工清洁资源来破坏我们的活动:删除可查看的视图或系统为我们制作的视图?

+0

如果您使用大量的高分辨率的位图/可绘制将被缩放,这将消耗大量的内存。这是特定活动中的问题吗?也许你在哪里提出了一个列表视图中有很多位图? – 2012-02-12 12:53:25

回答

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 
     } 
    } 
} 
+0

'unbindDrawables(findViewById(R.id.main));'应该是'unbindDrawables(findViewById(R.layout.main));'? – Si8 2013-08-27 18:24:49

+0

如果我想要解除布局中的所有图像以释放资源,直到再次调用布局,该怎么办? – Si8 2013-08-27 18:33:30

+0

@ SiKni8对于你的第一个评论,我用'R.id.main' - 它得到了视图,而不是布局 - 虽然布局也可能工作。对于你的第二个,不要解除一切 - 只要检查它是什么类型的视图。 – 2013-08-27 19:15:55