关于弱引用的问题

Issue about weakreferences

我的程序中有一两个weakreferences

举个例子:

ClassX myClassX= new ClassX(); //Line 1
WeakReference<ClassX> myWeakClassX = new WeakReference<ClassX>(myClassX); //Line 2
if(myWeakClassX.get() != null) // Line 3
{
    //do something with reference //Line 4
}

我的问题:

如何确保在第 3 行 myWeakClassX.get()Object 的引用有效时,它在第 4 行也有效?我可以想象,如果你真的不走运,GC 会准确地完成他的工作 "between" 第 3 行和第 4 行。请耐心等待,因为我对 Android/Java..

比较陌生

感谢任何解释。

您是正确的,在第 3 行和第 4 行中,get() 操作可以 return null,正如它应该做的那样。您始终可以将从 get() 操作中获得的引用复制到一个变量中(从而使其再次变强)并在 if 块中安全地使用它。因为你还有一个强引用,对象不会被垃圾回收。

一个简单的 null 检查可以是:

if(myWeakClassX.get() != null)
{
  ClassX myref = myWeakClassX.get();
  if(myref != null) {
      //use it
  }
}

然而,在活动的情况下,拥有强引用并不能保证 activity 不会被破坏,尽管您拥有有效的强引用,但 activity 可能会抛出异常当您尝试使用它时,它已被销毁。 示例:如果您在某个 AsyncTask 中保留对 activity 的引用,则 activity 可能会在 AsyncTask 运行之前被破坏(即方向改变)。尽管您将引用它,但是当您尝试更新 UI 时会出现异常。 这就是你可以在 AsyncTask 中创建一个指向 activity 的 WeakRefernce 的地方,如果 get() 操作开始 returning null,你会知道 activity 被破坏了无论什么原因而不是尝试使用它。

在Java中,首先要了解的是垃圾收集器从符合垃圾收集条件的对象中回收内存

问题是如何定义资格?

资格取决于指向该对象的引用类型。

为什么我们需要弱引用?

如果您创建一个对象的强引用,则该对象不能被垃圾回收。然而,弱引用,简单地说,是一种引用,其强度不足以强制对象保留在内存中。弱引用允许您利用垃圾收集器的能力来确定您的可达性,因此您不必自己做。

在这里发布

弱引用不足以阻止垃圾回收,因此您可能会发现(如果没有对 class 的强引用)myWeakClassX.get() 突然开始返回 null。

另一个选项是什么?

软参考

当您希望引用的对象在主机进程 运行 内存不足之前保持活动状态时,您可以使用 SoftReference。在收集器需要释放内存之前,该对象将不符合收集条件。粗略地说,绑定 SoftReference 意味着“固定对象直到你不能再固定”。

这样 myWeakClassX.get() 就不会为空。

我们可以在哪里使用的示例?

  1. 在您创建对 activity.

    的引用的任何辅助线程中

    弱引用弱Activity;

    //AsyncTask中的onPostExecute方法 Activity activity = weakActivity.get(); 如果(activity!=空){ // 在这里用 activity 做你的事情 }

  2. 如果您可以在其他地方引用 Activity 上下文,则可以使用弱引用。

  3. 在另一个线程中处理 imageview 中的位图资源时 http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

  4. 如果您正在创建任何 Hashmap 或任何小部件来保存任何数据,您可以使用弱引用。 http://developer.android.com/reference/java/util/WeakHashMap.html

  5. 使用无限制。在正确的地方使用它取决于开发人员。