代码之家  ›  专栏  ›  技术社区  ›  Sergey Shustikov

如何在片段旋转后的第二次不调用subscribe()body?

  •  2
  • Sergey Shustikov  · 技术社区  · 6 年前

    我有一个 Fragment Presenter .

    每次用户将应用程序移动到后台时,或将手机的挂起\恢复设置为我的逻辑 节目主持人 onResume() 而且 onPause() 当用户不与屏幕交互时,使演示者睡眠的方法。问题是:是否可以重新订阅Observable,但不打电话 subscribe()

    伪代码:

    片段:

    @Override
    public void onResume() {
        super.onResume();
        graphPresenter.attach(this);
    }
    
    @Override
    public void onPause() {
        super.onPause();
        graphPresenter.detach(this);
    }
    

    @Override
    protected void onAttach(View view) {
    
    final Observable<Data> dataObservable = 
            dataRepository.getDataIdentifier()
                    .switchMap(id -> {
    
                        //this calls each time on rotation =(
    
                        view.showDataLoading();
                        return repository.loadData(id);
                    });
    
        dataObservable.subscribe(data -> {
               view.showData(data);
               view.hideDataLoading();
        });
    }
    

    我的数据加载不太频繁,所以我不想看到加载指示器。只想在旋转后立即看到旧数据。

    setRetainInstance(true)

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mamykin Andrey    6 年前

    方法 setRetainInstance

    在您的情况下,最好的方法可能是在presenter中创建标志,这表示数据已加载:

    @Override
    public void onAttach(View view) {
        if (!isDataLoaded) {
            dataRepository.getData()
                    .doOnSubscribe(d -> view.showLoading(true))
                    .doAfterTerminate(d -> view.showLoading(false))
                    .doOnSuccess(d -> isDataLoaded = true)
                    .subscribe(view::showData, Throwable::printStackTrace);
        }
    }
    

    你也可以打电话 attach 方法不在 onResume onCreate ,据我所知,这不会导致错误。