关于内存泄漏的一个非常古老的链接谈论了一个引用了视图(link here)的drawable。
我有一些简单的问题:
为什么drawable会引用视图?
drawable对视图有什么作用?
它是否引用了所有使用它的视图?
各种drawable都有对视图的引用吗?
答案 0 :(得分:1)
我也在阅读 Romain Guy 的文章。网站/博客现已消失,Wayback link。
Drawable 有一个私有字段 (mCallback
),它指的是实现 Drawable.Callback
接口的类的实例,记录在 here 中。 View实现了这个接口,这个回调引用是系统在调用view.setBackground
时自动设置的。
public class View extends Object implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {}
为什么要设置这个字段?它的用法是Drawable
的一个实现细节,所以很难知道它的具体用法是什么。 “drawable 使用此界面来安排/执行动画更改。”这是我可以从文档中获得的全部内容。我想主要原因是调用 void scheduleDrawable(Drawable, Runnable, TimeToExecuteMeasuredSinceAppLaunch)
doc。
如果您想创建一个扩展 Drawable 的动画可绘制对象,请实现此接口。检索可绘制对象后,使用 Drawable#setCallback(android.graphics.drawable.Drawable.Callback) 为可绘制对象提供接口的实现;它使用此接口来安排和执行动画更改。
所以专门回答你的问题
为什么可绘制对象具有对视图的引用? 调用接口(scheduleDrawable
和其他接口方法)来为自身设置动画。而且,“安排和执行动画更改。”
drawable 对视图做了什么?drawable 在界面中调用这些方法。
它是否引用了所有使用它的视图? Drawable 有 1 个回调(所以只能使用 1 个视图),并且它可以使用 setCallback
记录的 here 进行设置。
所有类型的可绘制对象都引用视图吗?如果您设置了 setCallback
,是的。不必“动画化”即可获得引用,因为此 (setCallback
) 是根据 Drawable docs 自动使用 View.setBackground(Drawable) and ImageView.
完成的。
最后,我发现他的帖子令人困惑,因为他掩盖了导致内存泄漏(Drawable.Callback
接口,更重要的是 mCallback
字段)的根本原因的这个细节。最后,Drawable
中的回调存储为 private WeakReference<Callback> mCallback = null;
。他说,这是一个弱引用,不应导致内存泄漏。也许这是在他的博文之后对 Android 的改变。
编辑:啊哈!然后是 Romain 在 2010 年changed:
答案 1 :(得分:0)
1.为什么drawable可以引用视图?
一个drawable有一个对View的引用,因为它允许它拦截视图状态,假设你有一个selector-drawable,当例子中的视图模式改变时,按下,焦点,禁用改变它的背景