这是用例。在一个片段(称为PagerFragment)中,它注入了一个对象(称为DI_O),它是注释@Singleton,带有构造函数注入。当片段附加到活动时,它通过dagger获取对象DI_O实例。
当活动被破坏时片段也是如此,这个DI_O会被GC编辑吗?
当以这种方式实现时,注意到像配置更改或任何原因os杀死了活动(最小化应用程序,并且不要让活动保持活动状态并进行模拟),然后恢复活动,然后注入相同的DI_O通过匕首:
Application.getApplicationComponent(activity).inject(this);
这就是所希望的,因为在活动会话期间,DI_O中存储了一些数据,当os恢复活动时,这是同一会话所需的。
但这是否意味着DI_O实例将永远存在于应用程序的生命周期中,这在这里是不可取的?如果活动是新活动(onCreate() with savedInstance == null passed in as param)
,我们确实希望为新会话获得新的DI_O实例。
在我们的特定用例中,onSaveInstanceState()没有帮助,因为存储在DI_O中的数据来自第三方sdk而不是可序列化的,特别是它们只是通过api 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);
........
}