将匕首清除/ GC具有应用程序生命范围

时间:2018-02-23 21:47:11

标签: java android dagger onsaveinstancestate

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

    ........
}

0 个答案:

没有答案