这是用例。在一个片段(称为 PagerFragment)中,它注入了一个对象(称为 DI_O),它是带有构造函数注入的注解 @Singleton。当片段附加到一个活动时,它通过匕首获取对象 DI_O 实例。
当活动被销毁时,片段也会被销毁,这个 DI_O 会被 GC-ed 吗?
当以这种方式实现时,注意到类似配置更改或任何原因操作系统杀死了活动(使用“不要保持活动活动”来模拟最小化应用程序),然后恢复活动,然后通过匕首注入相同的 DI_O:
Application.getApplicationComponent(activity).inject(this);
这是所需要的,因为在活动的会话期间,DI_O 中存储了一些数据,当操作系统恢复活动时,同一会话需要这些数据。
但这是否意味着 DI_O 实例将随着应用程序的生命周期而永远存在,这不是这里所希望的?如果活动是新的(onCreate() with savedInstance == null passed in as param)
,我们确实希望为新会话获取一个新的 DI_O 实例。
在我们的特定用例中,onSaveInstanceState() 没有帮助,因为存储在 DI_O 中的数据来自 3rd 方 sdk 并且不可序列化,特别是它们是流式的,就像它只通过 api next(),在 next() 调用之后无法从流中再次获取相同的数据。它没有类似 ID 的东西,可以重新检索相同的数据。对于某些会话,它可能超过一兆。
与 onSaveInstanceState() 一样存储数据的更好方法是什么,但当活动/片段真正被销毁时也会被清除(isFinishing() == true)。
public class PagerFragment extends Fragment {
@Inject
DI_O mDio;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Application.getApplicationComponent(activity).inject(this);
}
........
}
@Singleton
public class DI_O extends BaseO {
private Set<Data> mCurrentSeesionData = new HashSet<>();
@Inject
public DI_O() {
super();
}
........
}
@Singleton
@Component(modules = {
ApplicationyModule.class
})
public interface ApplicationComponent {
void inject(ContentPagerFragment contentPagerFragment);
........
}