在每个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)
确实如此。是否足以让它像这样或者我还应该回收视图背景的位图?
答案 0 :(得分:1)
第一部分 - 解释setCallback(null)
的作用,你应该看一下&#34;回调&#34;是指。
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错误。回收() 方法允许应用程序尽快回收内存。
我看到这个代码用于许多其他问题,一些讨论可能会帮助未来的读者: