关于弱引用的问题

迈克

我的程序中只有一两个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()对an的有效引用时Object,在第4行也有效?我可以想象,如果您真的很不幸,GC会在“第3行和第4行之间”准确地完成他的工作。请耐心等待,因为我是Android / Java的新手。

感谢您的解释。

Prem

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

问题是如何定义资格?

资格的确定是基于指向该对象的引用类型。

为什么我们需要弱引用?

如果创建对对象的强引用,则无法对对象进行垃圾回收。简而言之,弱引用是强度不足以迫使对象保留在内存中的引用。弱引用使您可以利用垃圾收集器的能力来确定您的可达性,因此您不必自己做。

在这里发行

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

还有什么选择?

软参考

当您希望被引用的对象保持活动状态,直到主机进程的内存不足时,可以使用SoftReference。在收集器需要释放内存之前,该对象将无法进行收集。松散地说,绑定一个SoftReference意味着“将对象固定,直到不能再固定。”

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

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

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

    WeakReferenceweakActivity;

    //在AsyncTask中的onPostExecute方法中,Activity activity = weakActivity.get(); if(activity!= null){//在这里进行活动的东西}

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

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

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

  5. 使用量是无限的。开发人员应在适当的地方使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章