2017-08-08 2 views
0

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())); 
} 

答えて

0

解決済み。問題は、すべてのプレゼンターにシングルトンの注釈を付けたが、Moxyをどのように組織するかについての忘れが、プレゼンター自身のインジェクションであることを忘れたためです。

関連する問題