为什么drawable可以引用视图?

时间:2012-08-14 14:30:07

标签: android memory-leaks reference drawable android-view

关于内存泄漏的一个非常古老的链接谈论了一个引用了视图(link here)的drawable。

我有一些简单的问题:

  1. 为什么drawable会引用视图?

  2. drawable对视图有什么作用?

  3. 它是否引用了所有使用它的视图?

  4. 各种drawable都有对视图的引用吗?

2 个答案:

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

Romain guy's commit details in 2010, stating "Make Drawable.mCallback a WeakReference.
"

答案 1 :(得分:0)

  

1.为什么drawable可以引用视图?

一个drawable有一个对View的引用,因为它允许它拦截视图状态,假设你有一个selector-drawable,当例子中的视图模式改变时,按下,焦点,禁用改变它的背景