2015-05-19 9 views
12

Mam pewne wątpliwości dotyczące oszczędzania stanu za pomocą MVP na Androida. Zdefiniowałem moje fragmenty/działania jako widoki, a następnie zaimplementowałem odpowiednich prezenterów.MVP Android - Gdzie zapisać stan widoku?

Mój przykład jest prosty:

Mam aktywności z niektórych pól i obrotówki. Jeśli działanie zostanie zniszczone przez system Android, a następnie odtworzone, gdzie należy zapisać te stany spinnerów i pól wyboru? W widoku? Na prezentera?

Czy w widoku powinienem mieć logikę przywracania w widoku lub na prezenterze?

Dziękujemy!

Odpowiedz

2

W przypadku MVP, jest model, który jest odpowiedzialny za utrzymywanie stanu widoku.

Na przykład w modelować masz postu podmiot z tablicą Kategorie. W widoku masz pole wyboru dla każdej kategorii, a w każdej zaznaczonej/niezaznaczonej akcji dodajesz/usuwasz obiekty z tablicy Post Kategoria.

Gdy aktywny przywróceniu Zobacz powinien poprosić oKategoria tablicy Post tego, aby dowiedzieć się, które są wybierane, a które nie, więc można go ustawić właściwą sprawdzane/atrybut niezaznaczone.

Oto naprawdę dobra wiadomość o tym: http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

+0

Rozumiem, ale mój przykład jest formą stworzenia. Mój model może być postem z kategoriami. Problem polega na tym, że nigdy nie zapisuję obiektu postu. Celem jest utworzenie obiektu post i użycie go do utworzenia żądania internetowego. Sądzę więc, że jedynym sposobem na zrobienie tego jest przechowywanie w widoku, a następnie odtworzenie stanu widoku. Czy się mylę? @mmark –

+1

@ FábioCarballo, jeśli nie zrozumiem celu MVP, nie będziesz musiał zapisywać obiektu Post (przez "save" zakładam, że masz na myśli coś takiego jak lokalny db lub SharedPreferences). Prezenter + model to ten, który powinien przetrwać (w pamięci) poprzez zmiany stanu widoku – mmark

0

Presenter to interfejs pomiędzy modelem a widok i nie ponosi żadnej odpowiedzialności za oszczędność jakiegokolwiek państwa. Bardziej sensowne jest zezwolenie na stan modelu lub widoku:

  1. Model. Presenter jest odpowiedzialny za zapełnianie danych View with Model podczas inicjowania aktywności i natychmiast zatwierdza interakcje z modelem. Model jest zawsze aktualizowany, więc zmiany w konfiguracji są nieistotne.
  2. Wyświetl. Presenter jest odpowiedzialny za zapełnianie widoku z danymi modelu podczas inicjowania, jednak widok zapisuje i przywraca swój stan we wszystkich zmianach konfiguracji. Ma to sens w sytuacji tworzenia/edycji, w której istnieje przycisk "Zapisz" i masz przejściowy model (lub model roboczy).

To ostatnie podejście ma sens, gdy istnieje przycisk "Zapisz". Prezenter nie jest zaangażowany w żaden sposób.

0

1. Zapisz & Przywróć Wyświetl stan w widoku (aktywność/fragment).

Wolę oszczędność & przywracając stan widoku w widoku samego (aktywny/fragment)

Stąd odpowiedzialność widzenia, aby zapisać swój stan (stąd przestrzegać jednej zasady odpowiedzialności).

Przykład

/** 
* On Save Instance State. 
* 
* @param outState Out State. 
*/ 
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(STATE_KEY_USERNAME, getUserNameFieldValue()); 
    outState.putString(STATE_KEY_PASSWORD, getPasswordFieldValue()); 
    outState.putBoolean(STATE_KEY_REMEMBER_ME, getRememberMeFieldValue()); 
} 

/** 
* On Restore Instance State. 
* 
* @param savedInstanceState Saved Instance State. 
*/ 
@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null) { 
     String userName = savedInstanceState.getString(STATE_KEY_USERNAME, ""); 
     String password = savedInstanceState.getString(STATE_KEY_PASSWORD, ""); 
     boolean rememberMe = savedInstanceState.getBoolean(STATE_KEY_REMEMBER_ME, false); 

     userNameEditText.setText(userName); 
     passwordEditText.setText(password); 
     rememberMeCheckBox.setChecked(rememberMe); 
    } 
} 

2. Zapisz & Restore Presenter państwo w Presenter

Jeśli trzeba zapisać dowolny stan prezentera następnie zrobić to w prezentera.

mojej bazy prezenter będzie wyglądać ten

/** 
* On Create View. 
* <p> 
* 1. Gets called from view's onCreate method. 
* 
* @param view   View. 
* @param savedInstanceState Saved Instance State. 
*/ 
void onCreateView(final View view, final Bundle savedInstanceState); 

/** 
* On Attach View. 
* <p> 
* 1. Gets called from view's onStart method. 
*/ 
void onAttachView(); 

/** 
* On Detach View. 
* <p> 
* 1. Gets called from view's onStop method. 
*/ 
void onDetachView(); 

/** 
* On Save State. 
* <p> 
* 1. Gets called before view is destroyed to save the state of the presenter. 
* 
* @param outState Bundle in which to place your saved state. 
*/ 
void onSaveState(final Bundle outState); 

/** 
* On Destroy View. 
* <p> 
* 1. Gets called from view's onDestroy method. 
*/ 
void onDestroyView();