gpt4 book ai didi

android - 关于弱引用的问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:50 26 4
gpt4 key购买 nike

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

举个例子:

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 会在第 3 行和第 4 行“之间”完成他的工作。请耐心等待,因为我对 Android/Java 比较陌生..

感谢任何解释。

最佳答案

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

问题是如何定义资格?

资格取决于指向该对象的引用类型。

为什么我们需要弱引用?

如果您创建一个对象的强引用,则该对象不能被垃圾回收。然而,弱引用,简单地说,是一种引用,其强度不足以强制对象保留在内存中。弱引用允许您利用垃圾收集器的能力来确定您的可达性,因此您不必自己动手。

问题在这里

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

另一个选项是什么?

软引用

当您希望引用的对象在主机进程内存不足之前保持 Activity 状态时,您可以使用 SoftReference。在收集器需要释放内存之前,该对象将不符合收集条件。粗略地说,绑定(bind) SoftReference 意味着“固定对象直到你不能再固定为止。”

这样 myWeakClassX.get() 就不会为空。

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

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

    弱引用弱 Activity ;

    //AsyncTask中的onPostExecute方法 Activity activity = weakActivity.get();如果( Activity !=空){//在这里用 Activity 做你的事情

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

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

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

  5. 使用无限制。在正确的地方使用它取决于开发人员。

关于android - 关于弱引用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27904627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com