关于弱引用的问题

时间:2015-01-12 14:45:57

标签: android garbage-collection weak-references

我的程序中有一两个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确实完成了他的工作&#34;在#34;之间第3和第4行。请耐心等待,因为我对Android / Java来说相对较新。

感谢您的任何解释。

2 个答案:

答案 0 :(得分:2)

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

对null的简单检查可以是:

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

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

答案 1 :(得分:2)

在Java中,首先要了解的是垃圾收集器从有资格进行垃圾收集的对象中回收内存

问题是如何定义资格?

资格取决于哪种引用指向该对象。

为什么我们需要弱参考?

如果创建对对象的强引用,则无法对对象进行垃圾回收。然而,简单地说,弱引用是一个不足以迫使对象保留在内存中的引用。弱引用允许您利用垃圾收集器为您确定可达性的能力,因此您不必自己执行此操作。

此处发布

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

另一个选项是什么?

软参考

如果希望引用的对象保持活动状态,直到主机进程内存不足,则使用SoftReference。在收集器需要释放内存之前,该对象将无法进行收集。松散地说,绑定SoftReference意味着“将对象钉住,直到你再也不能。”

这样myWeakClassX.get()不会为null。

我们可以使用的示例?

  1. 在您创建活动引用的任何辅助线程中。

    WeakReference weakActivity;

    //在AsyncTask onPostExecute方法中 活动活动= weakActivity.get(); if(activity!= null){    //在这里做你的活动 }

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

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

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

  5. 用法无限制。开发人员可以在适当的地方使用它。