片段方法在每个演示者调用上重复

时间:2017-08-08 13:53:06

标签: android mvp rx-java2

我正在开发一个Andoid天气应用程序并遇到了问题。在抽屉里我有几个城市,当我成功请求调用视图方法updateWeather ...之后我选择其中一个Presenter方法,如果错误 - showError被调用。但问题是当我得到一个城市的天气(一个片段)而不是我从抽屉中选择另一个片段(另一个城市)时,查看方法updateWeather或showError多次调用(确切地说 - 与我切换的次数一样多)片段)。

在onActivityCReated我调用方法presenter.getWeather()

Presenter有这段代码

void getWeather() {
        Log.i("WeatherPresenter", "StartLoading");
        getViewState().showLoading();
        dataSubscription = repository.getWeatherData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(next -> {
                            Log.i("LoadWeather", "Success");
                            getViewState().hideLoading();
                            getViewState().updateWeatherCurrent(next.getWeatherResponse());
                            getViewState().updateWeatherHourly(next.getWeatherForecastHourlyResponse());
                            getViewState().updateWeatherDaily(next.getWeatherForecastDailyResponse());
                            getViewState().updateLastUpdateTime(dateFormat.format(new Date(next.getUpdatedTime())));
                        },
                        error -> {
                            getViewState().hideLoading();
                            Log.e("Error", error.getMessage());
                            getViewState().showError();
                        });
    }

如果发生错误,则从日志中获取方法getViewState()。showError();只召唤一次。但是在片段中,它调用的次数与切换片段的次数相同。

这是日志 - 了解我的意思

08-08 16:35:42.738 31682-31682/dvinc.yamblzhomeproject E/WeatherFragment: Error Shown
08-08 16:35:42.913 31682-31682/dvinc.yamblzhomeproject E/Error: Unable to resolve host "api.openweathermap.org": No address associated with hostname
08-08 16:35:42.914 31682-31682/dvinc.yamblzhomeproject E/WeatherFragment: Error Shown

在演示者中,我取消订阅

@Override
    public void detachView(WeatherView view) {
        super.detachView(view);
        Log.i("WeatherPresenter", "DetachView");
        if (dataSubscription != null) {
            dataSubscription.dispose();
        }
    }

这就是我切换片段的方式

@Override
public void showFragment(Fragment fragment) {
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragmentContainer, fragment)
            .commit();
}

以下是我如何从主演示者(负责导航)调用此方法

void openWeatherFragment(CityEntity cityEntity) {
        menuActiveCity = menuRepository.setActiveCity(cityEntity)
                .subscribeOn(Schedulers.io())
                .subscribe();

        getViewState().showFragment(WeatherFragment.newInstanse(cityEntity.getCityTitle()));
}

1 个答案:

答案 0 :(得分:0)

解决。问题是因为我用单例注释标记了所有演示者,但忘记了Moxy组织它的方式是自己注入演示者。