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