繁体   English   中英

为什么 drawable 有对视图的引用?

[英]Why does drawable have a reference to a view?

一个关于内存泄漏的非常古老的链接谈到了一个引用视图的可绘制对象( 链接在这里)。

我有一些关于它的简单问题:

  1. 为什么可绘制对象有对视图的引用?

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

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

  4. 所有类型的 drawable 都有对视图的引用吗?

我也在阅读 Romain Guy 的文章。 该网站/博客现已消失, Wayback 链接

Drawable 有一个私有字段 ( mCallback ),它指的是一个实现Drawable.Callback接口的类的实例,记录在这里 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

  • 所有类型的 drawable 都有对视图的引用吗? 如果你设置了setCallback ,是的。 不必“动画”即可获得引用,因为此 ( setCallback ) 是使用View.setBackground(Drawable) and ImageView.自动完成的View.setBackground(Drawable) and ImageView. 根据Drawable 文档


最后,我发现他的帖子令人困惑,因为他掩盖了这个细节,这是内存泄漏的根本原因( Drawable.Callback接口,更重要的是mCallback字段)。 最后, Drawable的回调存储为private WeakReference<Callback> mCallback = null; . 他说这是一个弱引用,不应导致内存泄漏。 也许这是在他的博文之后对 Android 的改变。

编辑:啊哈! 是 Romain 在 2010 年改变了它:

Romain 家伙在 2010 年的提交细节,声明“使 Drawable.mCallback 成为弱引用。”

1.为什么一个drawable有一个对视图的引用?

可绘制对象具有对视图的引用,因为它允许拦截视图状态,假设您有一个选择器可绘制对象,当示例中的视图模式更改时,按下焦点,禁用更改背景

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM