【问题标题】:Android WeakReferenceAndroid 弱引用
【发布时间】:2018-02-08 12:30:09
【问题描述】:

我有一个活动,我必须从一个地方触发一个自定义弹出对话框,该对话框也是一个单例

从我的活动中,我打开了弹出窗口:

  ScheduleDialog.getInstance().refreshContent(new WeakReference<Context>(this), new WeakReference<ScheduleDialog.interface>(this));

什么是最好的? 1) 创建 2 个本地引用(在 ScheduleDialog 中),例如:

   Context mContext = nContext.get();

2) 保持两者都像弱引用,并且仅在我需要它们时使用:

nContext.get();

这与泄漏错误/警告有关

谢谢

【问题讨论】:

  • 你没有解释为什么你使用WeakReference作为上下文(如果事实上你可以使用应用程序上下文)并且还显示了ScheduleDialog代码(否则我们不知道你的代码是否泄漏)。

标签: android weak-references


【解决方案1】:

如果我看到您的代码,您在获得Context nContext 变量中的弱引用值后再次创建强引用。因此,如果您想实现弱引用概念,需要遵循以下流程:-

定义全局类变量:-

private final WeakReference< Context > nContext;

通过从另一个区域传递来设置全局变量中的值

nContext = new WeakReference<Context>(nContext);

然后

if (nContext.get() != null) 
    // code
}

https://medium.com/google-developer-experts/weakreference-in-android-dd1e66b9be9d

【讨论】:

  • 我认为你的意思是 member variable 因为我们 don't 在 Java 中有全局变量。
  • 所以你指的是第二个选项,但有一点更新:在你的文章的帮助下,ScheduleDialog.getInstance().refreshContent(this,this)。对吧?
  • @user863873 老实说,我没有看到使用 Wea​​kReference 的意义,除非您的对话框可以比您的视图寿命更长,例如 Thread 的作用(这是您担心泄漏的唯一情况)。
  • 我明白你的意思。可能是一个虚拟的问题,但是:如果我有多个活动并且每个活动都有 recyclerview + 适配器怎么办。如果我在每个适配器中使用弱引用,如果会有内存问题......只有适配器将是 GC。或者这是不可能的,因为适配器是活动中的成员变量,如果内存问题,活动也将是 GC?
  • @user863873 如果您的活动被破坏,您的适配器和 RecyclerView 也将被垃圾收集(因为您的活动是唯一持有对它们的引用的人,除非 static 引用持有它们或后台线程本身)。您可以使用LeakCanary 进行实验。
【解决方案2】:

您必须将它们保留为 WeakReferences,否则垃圾收集器会看到对该对象的强引用并且不会收集它们,从而导致您提到的泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多