Acum View prezintă un model pe care ea afișează. Acest concept nu este nou. În descrierea originală a modelului MVC Reenskauga Trygve a spus aproape același lucru: Vezi uitam schimbarea modelului. Dar, din păcate, MVC. descrise în multe modele, nu la fel ca și cea formulată de Reenskaug Trygve în 1979.
Dezvoltatorii backend folosesc cadre MVC în dezvoltatorii iOS au un ViewController. Dar! În cazul în care este MVC în Android. Este controler de activitate? Ce este ClickListener. deloc în timpul nostru, MVC, că, odată ce a formulat Reenskaug ... Dar să continue până când s-au înecat în holivar.
Să ne întoarcem la ceea ce a fost spus la început. Având modelul dreapta rezolvă o mulțime de probleme în Android, care de multe ori le întâlnim în procesul de dezvoltare a aplicatiilor. Cum ar fi:
- Problema statului de aplicare (problema de stat)
- Modificarea orientării ecranului
- Navigarea teancul înapoi
- Procesul de distrugere / Program (deces de proces)
- imuabilitatea datelor (imuabilitatea și fluxul de date unidirecțional)
- starea Debugging și redare
- capacitatea de a testa
Să vorbim pornind de la problemele pe care le rezolvate în sensul tradițional al modelului MVP și MVVM. Și să vedem cum să formuleze conceptul de modele ne va permite să evite multe dintre capcanele.
Problema statului de aplicare (problema de stat)
Definiți ce stare (de stat). În cele mai multe cazuri, statul este înțeles ca ceva care este în prezent afișată pe ecran, cum ar fi „stat de descărcarea de conținut“, atunci când View afișează ProgressBar.
Ne concentrăm pe starea UI. starea interfeței. Și în aceasta constă esența. Să ne uităm la codul de mai sus (care este de a utiliza PersonsModel). Este posibil să observați că starea UI controlează prezentator. de lucru tipice se face și modelul MVVM.
Dar aș dori să împartă punerea în aplicare a MVVM model pe două abordări: prima este Android date cu caracter obligatoriu, iar al doilea înseamnă RxJava. In primul exemplu de realizare, starea este stocată în ViewModel.
Desigur, acest cod nu este perfect și ceva de adăugat. Ideea este că, în starea MVP și MVVM se realizează prin prezentatorul sau ViewModel.
Din aceasta putem trage următoarele concluzii:
- Logica de afaceri este starea lor, Prezentator (sau ViewModel) - sa (puteți sincroniza aceste stări, ele sunt similare) și View poate avea, de asemenea, o stare.
- Prezentator (sau ViewModel) pot avea o multitudine de metode de control (care determină View. De exemplu) și este normal. Dar, în același mod Presenter poate avea o multitudine de ieșiri (de exemplu, date și metode pentru View. Cum ar fi view.showLoading () sau view.showError () în MVP). Toate acest set poate duce la stări conflictuale de vedere. Prezentator și logica de afaceri, mai ales atunci când munca se face cu o mulțime de fire.
Astfel de erori sunt foarte greu de prins, mult mai puțin se repetă.
Ce se poate face în cazul în care o sursă de statut? Am vorbit deja despre acest lucru la început, când am discutat întrebarea „Ce este un model?“.
Poți ghici? Modelul răspunde la stat. De îndată ce am înțeles - multe dintre problemele asociate cu starea (de stat) au fost rezolvate, iar prezentatorul este doar o singură cale getView () face (PersonsModel) .. Acest lucru este similar cu funcția f (x) = y (cât mai multe argumente posibile). Și, în contrast cu codul, matematica nu stie bug-uri =)
Este important să înțelegem ce este un „model“ și modul în care operedelit, deoarece aceasta poate duce la model pentru a rezolva „problema statului“
Modificarea orientării ecranului
Cel mai simplu mod - este de a ignora schimbarea de orientare. Pur și simplu reporniți datele după schimbarea orientării ecranului. Este o decizie bine fundamentată. În cele mai multe cazuri, aplicația funcționează în modul offline, astfel încât datele provine dintr-o bază de date locală sau cache. Prin urmare, încărcarea de date este foarte rapid după schimbarea orientării ecranului. Astfel, dezvoltatorii au început să folosească MVP pentru a «reține prezentator», pentru a fi în măsură să decupleze (și distruge) View atunci când schimbă orientarea ecranului în timp ce prezentatorul este în memorie, și apoi re-lega View prezentatorului. O astfel de soluție există și în MVVM cu RxJava.
Dar există o problemă cu economie de Presenter'a (sau ViewModel). Vezi cum de a restabili starea de la o stare înainte de rotația ecranului, astfel încât View și prezentatorul au fost în aceeași stare? Biblioteca Mosby este decis prin Viewstate care sincronizează starea logica de business View. Moxy. altă bibliotecă MVP pune în aplicare o abordare interesantă prin „comanda“ pentru a restabili starea de View.
Sunt sigur că la fel cum există alte soluții legate de problema statului. Și astfel, aceste biblioteci rezolva problema statului, pe care le-am vorbit deja.
Și avem din nou "model", care reflectă actuala "sostonie" și doar o singură metodă "face" (getView (). Render (PersonsModel)). Soluția 2 este practic redus la problema 1
Navigare stivă Înapoi
Am nevoie pentru a păstra Prezentator (ViewModel) atunci când View nu mai este utilizat? De exemplu, în cazul în care Fragment (View) a fost înlocuit cu un alt Fragment. pentru ca utilizatorul sa mutat pe un alt ecran, nu mai este atașat la Vizualizarea prezentatorului. Dacă View nu este atașat la prezentator. atunci, evident, ea nu va fi capabil să faceți upgrade la cele mai recente date. Ce se întâmplă dacă utilizatorul decide să se întoarcă la ecranul (de exemplu, a făcut clic pe butonul din spate)? Reîncarcă datele sau reutiliza prezentatorului. Aceasta este întrebarea filozofică =). De obicei, atunci când reveniți la ecranul anterior, utilizatorul se așteaptă să-l vadă așa cum a fost el (pentru ca utilizatorul cum sa „stânga“). Este cea mai mare parte „problema View de recuperare de stat (a se vedea punctul 2). Soluția este aceeași: statul modelul restaurează prin apelarea la ViewgetView () face (PersonsModel) ..
managementul proceselor
O greșeală des întâlnită în lumea de dezvoltare Android este considerat că procesul de distrugere un lucru rău, și avem nevoie de bibliotecă pentru a ajuta la conservarea și restaurarea statului după procesul de distrugere. Ei bine, în primul rând procesul este distrus atunci când sistemul de operare Android nevoie de mai multe resurse pentru alte aplicații, sau pentru a conserva energia bateriei. Dar acest lucru nu se va întâmpla în cazul în care aplicația este activă (în prim-plan) și utilizatorul îl folosește în acest moment. Dacă într-adevăr nevoie pentru a efectua o sarcină lungă - de a utiliza Serviciul, ca o opțiune pentru a spune sistemul de operare pe care aplicația este încă folosit în mod activ.
Odată cu distrugerea Android oferă o metodă de proces provocare onSaveInstanceState () pentru a salva de stat. Din nou Stare =) (State). Fie pentru a păstra informațiile de la vedere în mănunchiul. Are PRESENTER averea sa, care, de asemenea, ar trebui să fie păstrate în pachet. Dar despre starea de logica de afaceri? Am descris deja aceste probleme la alineatul 1 - 3. Pentru aceasta, avem nevoie de o clasă de model. care restabilește / menține „toate“ de stat. Apropo, nu au nevoie pentru a salva nimic suficient de des =)