Android 垃圾收集器在主线程上运行?

标签 android garbage-collection

示例: 理想情况下,对象是可回收垃圾( Activity 改变方向和对对象丢失的强引用)但尚未处理。所以第 2 行将返回 true。在第 3 行执行时,有什么方法可以处理对象吗?还是等到它完成?

new Thread {

       WeakReference item= new WeakReference(object);

       void method(){
2      if(item.get()!=null)
3          item.get().getName();
      }
}

最佳答案

如果您对某个对象有强引用,则该对象不符合 GC 条件。

只要您可以访问该 object 引用,强引用对象就不会在 null 检查和下一行之间的代码中被释放...或任何其他行。仅当您将该对象引用设置为 null,或者您将另一个对象分配给该引用时,如果没有其他引用指向它,前一个对象才会被垃圾回收。

另一方面,当你处理(任何类型的)弱引用时,首先你必须从弱引用包装器中取出强引用,然后你可以安全地进一步使用那个强引用(在你检查它不是空,当然)。如果不采用强引用,弱包装中的对象随时可能消失。

错误用法 - 可以在空检查和 getName 调用之间收集对象

if(item.get()!=null)
   item.get().getName();

正确用法——为进一步处理取强引用

Object object = item.get();
if(object!=null)
   object.getName();

关于Android 垃圾收集器在主线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52364281/

相关文章:

c# - 常量是否固定在 C# 中?

java - GC能走多远

android - 垃圾收集器可以释放单例实例吗? (以及为什么或如何避免)

支持库中的 Android CalendarView

java - Sun JVM 能否毫无问题地处理巨大的堆大小?如何处理?

c++ - gcc 4.8.1 是否支持 C++11 垃圾回收?

java - 调用 API 成功但无法从 setter 和 getter 获取字符串

android - PushSharp 是否需要打开运行它的机器的入站端口?

android - Apktool-检索项目 : No resource found that matches the given name 的父级时出错

java - 无法在 Java 中添加整数值