1

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

我对此有一些简单的问题:

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

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

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

  4. 各种可绘制对象都引用了视图吗?

4

2 回答 2

1

我也在读 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 有 1 个回调(因此只能使用 1 个视图),并且可以使用这里setCallback记录的设置。

  • 各种可绘制对象都引用了视图吗?如果您设置setCallback,是的。它不必是“动画”来获得引用,因为 this ( ) 是根据Drawable docssetCallback自动完成的。View.setBackground(Drawable) and ImageView.


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

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

Romain guy 在 2010 年的提交细节,说明

于 2021-02-06T14:36:10.047 回答
0

1.为什么drawable有一个view的引用?

由于允许它拦截视图状态,drawable 具有对 View 的引用,假设您有一个 selector-drawable ,当按下示例中的视图模式更改时,焦点,禁用更改它的背景

于 2012-08-14T14:52:22.393 回答