Andoid天気アプリケーションを開発中に問題が発生しました。引き出しにはいくつかの都市があり、viewメソッドupdateWeather ...を呼び出すのが成功した後、それらのPresenterメソッドの1つを選択すると、エラーが発生した場合 - showErrorが呼び出されます。しかし問題は、1つの都市(1つのフラグメント)の天気があり、引き出しから別のフラグメント(別の都市)を選択するよりも、updateWeatherまたはshowErrorが何度も呼び出されるビューメソッドを表示することです断片)。 onActivityCReatedで各プレゼンターのコールで重複するフラグメントメソッド
私は、エラーがメソッドgetViewState()を発生した場合メソッドpresenter.getWeather()
プレゼンタログからこのコード
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();
});
}
を有する呼び出し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()));
}