为什么在Android监听器中要使用WeakReference?

13

我正在处理一个庞大的代码库,发现很多地方都有这种代码:

public static class RequestCustomData implements View.OnClickListener {
    WeakReference<MainActivity> mainActivity;

    public RequestCustomData(MainActivity activity) {
        mainActivity = new WeakReference<>(activity);
    }

    @Override
    public void onClick(View view) {
        MainActivity activity = mainActivity.get();
        activity.requestCustomData(true, null);
    }
}
我有点困惑为什么这被用在那么多地方?我看了这份文件,但它没有很好地解释为什么这种代码在我正在工作的应用程序中如此频繁地使用。
有人能否解释一下这是否是一种常见的模式?如果是,为什么?

https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references


1
通常它是对监听器生命周期限制不严谨的一种权宜之计。请注意,在您的示例中,如果WeakReference的预期目的真正发挥作用,onClick(...)将抛出NullPointerException。如果此代码没有崩溃,则使用WeakReference可能是空洞编程的一个例子。 - Kevin Krumwiede
1个回答

27
简单来说,弱引用是一种不足以强制对象保留在内存中的引用。
代码作者很可能想要避免如果RequestCustomData对象能够比Activity本身更长寿,导致Activity上下文泄漏的情况。
我建议阅读Romain Guy关于此主题的文章,并避免以下几种特定情况:

6
确实是这个原因驱使人们这么做。但通常最好确保听众首先不要比活动更长寿。 - Kevin Krumwiede
Romain Guy的帖子链接显示“无法建立数据库连接”的错误。我想这个链接已经失效了。 - Shashanth
1
Romain Guy的帖子无法访问。在我看来,这篇文章是基于那篇帖子的:https://android-developers.googleblog.com/2009/01/avoiding-memory-leaks.html - csonuryilmaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接