关于弱引用的问题
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() 就不会为空。
我们可以在哪里使用的示例?
在您创建对 activity.
的引用的任何辅助线程中
弱引用弱Activity;
//AsyncTask中的onPostExecute方法
Activity activity = weakActivity.get();
如果(activity!=空){
// 在这里用 activity 做你的事情
}
如果您可以在其他地方引用 Activity 上下文,则可以使用弱引用。
在另一个线程中处理 imageview 中的位图资源时
http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
如果您正在创建任何 Hashmap 或任何小部件来保存任何数据,您可以使用弱引用。 http://developer.android.com/reference/java/util/WeakHashMap.html
使用无限制。在正确的地方使用它取决于开发人员。
我的程序中有一两个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() 就不会为空。
我们可以在哪里使用的示例?
在您创建对 activity.
的引用的任何辅助线程中弱引用弱Activity;
//AsyncTask中的onPostExecute方法 Activity activity = weakActivity.get(); 如果(activity!=空){ // 在这里用 activity 做你的事情 }
如果您可以在其他地方引用 Activity 上下文,则可以使用弱引用。
在另一个线程中处理 imageview 中的位图资源时 http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
如果您正在创建任何 Hashmap 或任何小部件来保存任何数据,您可以使用弱引用。 http://developer.android.com/reference/java/util/WeakHashMap.html
使用无限制。在正确的地方使用它取决于开发人员。