drawable.setCallback的后果(null);
在试图实现Drawables的小内存缓存时,我了解到为了避免关闭活动后的内存泄漏,我需要解除这些Drawables的绑定:将它们的回调设置为null。
因为在每个活动中维护Drawables需要额外的代码,所以我试图在setImageDrawable(drawable)
之后立即解除绑定,并且迄今为止我没有看到任何结果。
这是来自MyImageView类的代码( extends ImageView
):
setImageDrawable(drawable);
d.setCallback(null);
在调试器中,我可以清楚地看到,在第一行回调为空之前,在第一行之后将其设置为此imageView,之后我再次将其设置为空。 它通常显示在那之后..
setCallback (Drawable.Callback cb)
文档声明:
将Drawable.Callback对象绑定到此Drawable。 需要支持动画可绘制的客户端。
由于我不需要动画可绘制,所以我不明白为什么我不应该这样做,但是让我感到困扰的是,在一些关于Android的内存泄漏的博客中,关于drawable的内存泄漏只有在活动完成后才能完成。 问题是,为什么在绑定到ImageView
时总是自动设置回调?
是否有一些边界条件,其中回调设置为null的drawable会导致问题? 不显示或NPE?
您不应该缓存Drawables - Drawable对象是非常有状态的,并且打算由一个且只有一个所有者使用。
如果你想实现一个缓存,你应该缓存drawable的常量状态。
恒定状态是用这个检索:
http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getConstantState()
(注意,这个方法可以返回null;并非所有Drawable都具有常量状态。)
您可以稍后使用以下方法从常量状态实例化新的Drawable:
http://developer.android.com/reference/android/graphics/drawable/Drawable.ConstantState.html#newDrawable(android.content.res.Resources)
另外请记住,Resources已使用此工具为您保留了一个Drawables缓存,因此您无需为从资源中检索的任何Drawable实现自己的缓存。
如果您在资源之外制作自己的Drawable,我强烈建议制作底层数据的缓存(例如从网络下载的位图),然后尝试弄乱状态。 (同样,绝对不要自己缓存Drawable对象。)
链接地址: http://www.djcxy.com/p/93107.html上一篇: Consequences of drawable.setCallback(null);
下一篇: Getting out