Android中的代码说明

时间:2014-09-11 11:11:40

标签: android

在每个onDestroy的应用程序中,我在视图上调用它,因为我读到它是最小化OOM异常的一个好习惯。

    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 个答案:

答案 0 :(得分:1)

第一部分 - 解释setCallback(null)的作用,你应该看一下&#34;回调&#34;是指。

动画drawable时使用

Drawable.Callback。根据在线文档:

  

如果要创建动画drawable,请实现此接口   扩展了Drawable。检索绘图后,使用   提供setCallback(android.graphics.drawable.Drawable.Callback)   你对drawable的接口的实现;它使用这个   用于安排和执行动画更改的界面。

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

如果您不删除这些引用,则在取消绑定可绘制内容时可能会泄漏内存。


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

如果您是为2.3及以下编写的,则应回收位图。请参阅Managing Bitmap Memory上的页面:

  

在Android 2.3.3(API级别10)及更低版本上,使用recycle()是   推荐的。如果你在你的网站上显示大量的位图数据   应用程序,您可能会遇到OutOfMemoryError错误。回收()   方法允许应用程序尽快回收内存。


我看到这个代码用于许多其他问题,一些讨论可能会帮助未来的读者: