Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果ViewModel持有此活动实现的接口引用,GC是否会收集活动引用?_Java_Android_Interface_Garbage Collection_Viewmodel - Fatal编程技术网

Java 如果ViewModel持有此活动实现的接口引用,GC是否会收集活动引用?

Java 如果ViewModel持有此活动实现的接口引用,GC是否会收集活动引用?,java,android,interface,garbage-collection,viewmodel,Java,Android,Interface,Garbage Collection,Viewmodel,假设我有一个实现接口i的活动A。我的ViewModel类(VM)持有对实现接口i的对象的引用: class A extends Activity implements I{ ... onCreate(){ mViewModel.setI(this); } } class B extends ViewModel { private I iRef; ... } 如果活动A销毁,GC会收集活动对象吗?或者由于ViewMode类中的接口引用,对象将不符合GC条件 更新

假设我有一个实现接口i的活动A。我的ViewModel类(VM)持有对实现接口i的对象的引用:

class A extends Activity implements I{
  ...
  onCreate(){
    mViewModel.setI(this);
  }
}

class B extends ViewModel {
   private I iRef;
   ...
}
如果活动A销毁,GC会收集活动对象吗?或者由于ViewMode类中的接口引用,对象将不符合GC条件

更新:
在我的项目中,所有VM存储在某个VMHolder类中,以便快速将其分配给视图(活动),这样当活动被销毁时,VM对象就不会被销毁

如果活动A销毁,GC会收集活动对象吗

是的,只要
I iRef
不是
static
,并且没有在某个线程中使用,您的活动及其所有对象都可以进行垃圾收集

由于ViewMode中的接口引用,对象将不符合GC条件 上课


否,
mViewModel
对象的生命周期较短,或者取决于活动的生命周期,因此当活动的对象死亡时,它的所有成员也会死亡,在我的项目中,垃圾收集将不会出现问题。在某个VMHolder类中的所有VM存储将快速将其分配给视图(活动),因此,当活动被销毁时,VM对象不会被销毁。我不知道您在这里使用view holder和view model究竟想实现什么,也不知道您的
VMHolder
在做什么,但只要不使用静态引用,也不使用线程更新viewmodel,就不太可能看到内存泄漏,而且您可以利用它