其他分享
首页 > 其他分享> > android-关于弱引用的问题

android-关于弱引用的问题

作者:互联网

我的程序中有一个或两个弱引用.

例如:

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()具有对对象的有效引用,而在第4行也有效?我可以想象,如果您真的很不幸,GC会在“第3行和第4行之间”准确地完成其工作.

感谢您的解释.

解决方法:

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

问题是如何定义资格?

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

为什么我们需要弱引用?

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

在这里发行

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

还有什么选择?

软参考

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

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

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

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

WeakReferenceweakActivity;

//在AsyncTask中的onPostExecute方法中
活动活动= weakActivity.get();
if(activity!= null){
   //在这里进行活动
}
>如果您可以在其他地方引用活动上下文,则可以使用弱引用.
>在另一个线程中处理imageview中的位图资源时
http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
>如果要创建任何哈希图或任何小部件来保存任何数据,则可以使用弱引用. http://developer.android.com/reference/java/util/WeakHashMap.html
>使用不受限制.开发人员应在适当的地方使用它.

标签:weak-references,android,garbage-collection
来源: https://codeday.me/bug/20191028/1955017.html