0

这是用例。在一个片段(称为 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);

    ........
}
4

0 回答 0