2014-09-11 80 views
1

在我的每个onDestroy应用程序中,我将这个视图称为视图,因为我认为这是一个最小化OOM异常的好习惯。Android中的代码解释

public 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)); 
     } 
    ((ViewGroup) view).removeAllViews(); 
    } 
} 

的事情是,它不是真正清楚,我什么

view.getBackground().setCallback(null)究竟。是否足够让它像这样或我应该回收视图背景的位图?

回答

1

第一部分 - 为了解释setCallback(null)做了什么,你应该看看“回调”是指什么。

Drawable.Callback用于动画绘制drawable时。按照在线文档:

如果要创建可扩展Drawable的动画可绘制 ,请执行此接口。在检索drawable时,使用 setCallback(android.graphics.drawable.Drawable.Callback)来提供 您实现的可绘制接口;它使用此接口来调度和执行动画更改。

您正在通过设置为null来阻止任何进一步的动画回调。这将删除Drawable将包含在Callback对象中的任何引用。

如果您不删除这些引用,则可以在解除绑定绘图时泄漏内存。


第二部分 - 您应该在此调用之后回收您的位图吗?是。此调用将删除活动视图和drawable之间的链接,但不会回收drawable使用的内存。

如果您正在编写2.3及更低版本,则应该回收位图。请参见Managing Bitmap Memory

在Android 2.3.3(API等级10)和较低的,使用循环()是 建议。如果您在 应用中显示大量位图数据,则可能会遇到OutOfMemoryError错误。回收() 方法允许应用程序尽快回收内存。


我看到这个代码在许多其他问题时,有些讨论可能有助于未来的读者:

+0

我该如何删除这些引用? – Libathos 2014-09-11 12:12:54

+0

哦,我现在看到了,所以与位图无关,所以我应该在onDestroy上回收它吧? – Libathos 2014-09-11 12:25:48