2017-08-08 35 views
0

我正在開發一個Andoid天氣應用程序並遇到問題。在抽屜中,我有幾個城市,當我選擇其中一個Presenter方法成功請求調用視圖方法updateWeather ...之後,如果調用error - showError。但問題是,當我得到一個城市(一個片段)的天氣,而我從抽屜中選擇另一個片段(另一個城市)時,查看方法updateWeather或showError多次調用(準確地說 - 多次我切換片段)。複製每個主持人呼叫的片段方法

在onActivityCReated我調用方法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(); 
         }); 
    } 

從日誌是否發生錯誤的方法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())); 
} 

回答

0

已解決。問題是因爲我用單身註釋標記了所有演示者,但忘記了Moxy如何組織它自己注入演示者的方式。