codeestX / GeekNews

:books:A pure reading App based on Material Design + MVP + RxJava2 + Retrofit + Dagger2 + Realm + Glide
3.49k stars 826 forks source link

请教initEventAndData()的调用逻辑 #73

Closed jackgreentemp closed 7 years ago

jackgreentemp commented 7 years ago

您好,想请教一下SimpleFragment和BaseFragment里的以下代码中,initEventAndData()的调用逻辑是怎么考虑的,第一处比较好理解,第二处和第三处看不太明白。

我理解您这样处理的目的应该是:在view显示的时候去执行initEventAndData(),view隐藏时不执行initEventAndData()

对于第二处,如果是内存启动(savedInstanceState不为null),在isSupportHidden()=false时执行initEventAndData(),这里为什么要用isSupportHidden()?

还有新版的Fragmentation中isSupportHidden()不再是public的,这个该怎么处理?

对于第三处onHiddenChanged那部分就更晕了,感觉和第一、二处逻辑上会有重复?

@Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mPresenter.attachView(this);
        mUnBinder = ButterKnife.bind(this, view);
        if (savedInstanceState == null) {
            if (!isHidden()) {
                isInited = true;
                initEventAndData();
            }
        } else {
            if (!isSupportHidden()) {
                isInited = true;
                initEventAndData();
            }
        }
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!isInited && !hidden) {
            isInited = true;
            initEventAndData();
        }
    }
codeestX commented 7 years ago

@jackgreentemp Hello, 这款应用使用的是早期的Fragmentation,当时还没有提供懒加载的方法,所以作者给了一个懒加载的demo,这里就是参考demo写的

新版Fragmentation已经提供懒加载的LazyFragment,就不用自己在外部实现了,可以参考它的WiKi

至于为什么要用isSupportHidden(),可以戳进这个方法里去看一下它的源码,它在onSaveInstanceState(Bundle outState)保存当前Fragment状态时专门存储了一个标志位用于恢复状态时使用

我的建议是要么用高版本的Fragmentation提供的LazyFragment,要么用原生Fragment自己做一下类似的懒加载封装,不建议再用这个低版本的Fragmentation了