Verdienen Sie Geld mit Ihren Tech-Blogs, Gadgets und Tipps

MVVM Android-arkkitehtuuriohjelmointi!

Huomautus: Seuraava artikkeli auttaa sinua: MVVM Android -arkkitehtuurin ohjelmointi!

Tällä hetkellä voidaan sanoa, että Androidin MVVM-arkkitehtuuri on paras arkkitehtuuri sovellusten toteuttamiseen MVP:n tai MVC:n kaltaisten arkkitehtuurien yli. Tämä opetusohjelma käsittelee ja ottaa käyttöön Android MVVM -arkkitehtuurimallin Android-sovelluksessamme. Olemme jo keskustelleet MVP-arkkitehtuurikuviosta Androidissa.

Arkkitehtuurityypit Androidissa

(MVVM (malli, näkymä, malli

(MVP (malli, näkymä, moderaattori)

(MVC (malli, näkymä, ohjain)

Mikä on MVVM-arkkitehtuuri?

MVVM tulee sanoista Model, View, ViewModel.

Model, View, ViewModel (MVVM) on John Gusmanin ehdottama ohjelmaarkkitehtuurimalli vaihtoehtona MVC- ja MVP-malleille tiedonsidontatekniikkaa käytettäessä. Tarkastellaan ensin tämän mallin kuvausta ja analysoidaan jokaista sen osaa. MVVM on ohjelmistoarkkitehtuurin suunnittelupohja, joka helpottaa käyttöliittymän erottamista sovelluksen liiketoimintalogiikasta ja tietomallista.

Malli

Mallikerros voi sisältää pääsyn tietoihin (tietovarasto, tietovarastot, sovellusliittymät), entiteettiluokkia jne. Malli on tiedontarjoaja tietojen päivittämiseen. Tietoja voi olla saatavilla useista lähteistä, esim.

  • REST API
  • Realm DB
  • SQLite-tietokanta
  • Hallitsee siirtoa
  • Yleiset asetukset
  • Palopohja
  • Jne.

Malli ei tiedä mitään View- tai ViewModelista ja on olemassa itsenäisesti. Jos siirrät Android-sovelluksen MVC- tai MVP-mallissa MVVM:ään, mallikerrosta ei todennäköisesti tarvitse muuttaa.

näkymä

Näkymä on se, mitä käyttäjä näkee, ja Android-ohjelmoinnissa näkymät ovat yleensä määritettävissä XML-muodossa. Ja ovat yleensä havaittavissa Fragment-, Activity- tai View-luokissa. Monissa Android-sovelluksissa ei-näkymään liittyvä koodi, erityisesti liikelogiikka, sekoitetaan usein fragmentteihin ja aktiviteetteihin. Joita voi olla erittäin vaikea kehittää tai ylläpitää.

MVVM ratkaisee tämän ongelman ylläpitämällä fragmentteja ja aktiviteetteja vain osana näkymäkerrosta. Sinun tarvitsee vain asettaa näkymä ja yhdistää ViewModel näkymään (työkaluilla, kuten RxJava).

Toisin kuin View, MVC:llä ei ole mallitietoja. view tuntee vain ViewModelin, jota se käyttää tietojensa täyttämiseen näyttöä varten.

Näkymässä ei saa olla näyttölogiikkaa (päivämäärän muotoilu, kohteen näyttämisen/piilottamisen säännöt jne.), joka sen sijaan on olemassa ViewModelissa. Näkymä voi pyytää ViewModelin toimintaa, joka yleensä päivittää mallin käyttäjän syötteen perusteella.

View on esimerkiksi vastuussa seuraavien aiheiden käsittelystä:

  • Valikot
  • Käyttöoikeudet
  • Tapahtuman kuuntelija
  • Vuoropuhelut, maljat, välipalapatukat ovat esillä
  • Työskentely Android Viewin ja Widgetin kanssa
  • Aloita aktiviteetit
  • Kaikki Android-kontekstiin liittyvät toiminnot

ViewModel

ViewModel sisältää Viewin vaatimat tiedot. Kuten nimestä voi päätellä, ViewModel on View and Model -silta. Poimii tiedot mallikerroksesta ja muuntaa sen näyttöä varten. ViewModel ylläpitää ohjelman aktiivisen tilan. Avaa tämän toiminnon näkymään ja tarjoaa käyttöliittymän mallin päivittämiseen. ViewModels on eräänlainen POJO, mikä tarkoittaa, että ne ovat helposti testattavissa, yksi niiden tärkeimmistä eduista.

ViewModelilla on seuraavat vastuut:

  • Paljasta tiedot
  • (Tilailmoitus (edistyminen, offline, tyhjä, virhe jne.)
  • Näkyvyys asioissa
  • Syötteen vahvistus
  • Soita mallille
  • Suorita menetelmät näkymässä

ViewModelin tarvitsee vain tietää sovelluksen konteksti. Konteksti Ohjelma voi sisältää:

  • Aloita palvelu
  • Sitoudu palveluun
  • Lähetä lähetys
  • Rekisteröi lähetysvastaanotin
  • Lataa resurssiarvot

Eikä saa sisältää seuraavia:

  • Näytä valintaikkuna
  • Aloita aktiviteetti
  • Täytä asettelua

Ero MVVM:n ja MVP:n välillä:

  • ViewModel on keskikerroksessa Presenterin sijaan.
  • Moderaattori viittaa Näytä. ViewModel ei ole sellainen.
  • ViewModel lähettää datavirtoja.
  • Esittäjällä ja näkymällä on 1:1-suhde.
  • Viewilla ja ViewModelilla on 1:n-suhde.
  • ViewModel ei tiedä, että View kuuntelee.

Ero MVVM:n ja MVC:n välillä:

MVVM jakaa useita konsepteja yleisemmän Model View Controllerin (MVC) kanssa, joten MVC:n jo tunteneet tai sen kanssa työskennelleet voivat helposti työskennellä MVVM:n kanssa. Ero on siinä, miten he kommunikoivat ja miten he näkevät toisensa.

MVVM:n edut

Näytä mallit helpottavat näytön logiikan testaamista:

Näkymämallien avulla näytön logiikkaa voidaan testata ilman, että sitä nähdään hetkessä. Android-kehityksen avulla enemmän testejä voidaan kirjoittaa JUnitissa ja suorittaa paikallisesti, ei Android JVM:ssä (emulaattorissa tai laitteessa), mikä tarkoittaa, että testit toimivat paljon nopeammin.

Suhteiden erottaminen:

Hauras koodi aiheuttaa ohjelman ylläpitoon painajaisia. Oletetaan, että alamme kehittää sovellusta ilman arkkitehtuuria. Tässä tapauksessa aiheutamme lisää virheitä ohjelmaan ja kun haluamme lisätä ohjelmaan uuden toiminnon, joudumme hämmennykseen. Tästä syystä ohjelman kehitysnopeus on hyvin hidasta ja aiheuttaa asiakkaan tyytymättömyyden ohjelman kehitysprosessiin. Yksi tärkeimmistä eduista, joita näemme usein Android-sovelluksissa, ovat sisäänrakennetut toiminnot ja fragmentit, jotka sisältävät liiketoimintalogiikkaa ja suoran vuorovaikutuksen koko View-koodiin sisältyvän tietokannan tai API:n kanssa. Lisäksi MVVM auttaa ylläpitämään puhdasta, johdonmukaista ja täysin pariliitosarkkitehtuuria, jotta toiminnot ja fragmentit pysyvät vain osana näkymää.

Parantaa koodin uudelleenkäyttöä:

Näkymämalleja voidaan käyttää uudelleen koko Sovelluksessa, jolloin näyttölogiikkaa ei tarvitse kopioida. Tämä näkymä voidaan jopa siirtää toiseen paikkaan ja silti käyttää samaa ViewModel- ja ViewModel-mallia, kunhan se riippuu samoista tiedoista ja toiminnoista.

Käyttöliittymä voidaan päivittää koskematta liiketoimintalogiikkaan:

Tämä tarkoittaa, että harvemmat valmistajat voivat työstää komponentteja, joissa on vähemmän ristiriitoja, mikä helpottaa tiimien määrän lisäämistä. Esimerkiksi käyttöliittymäkehittäjä voi työskennellä View-Sovelluksella itsenäisesti ilman logiikkaa ViewModelissa. Sitä vastoin toinen kehittäjä saattaa työstää eri osaa ja käyttää ViewModelin väärennettyä versiota. Samaan aikaan alkuperäinen versio on kehitteillä.

Kaksi tapaa ottaa MVVM käyttöön Androidissa:

Tässä artikkelissa käytämme tietojen sidontaa.Google esitteli Data Binding Libraryn tietojen linkittämiseksi suoraan XML-asettelussa.

Haluamme luoda yksinkertaisen esimerkin kirjautumisohjelmasta, joka pyytää syötteitä käyttäjältä. Näemme, kuinka ViewModel ilmoittaa näkymälle, milloin viesti (paahtoleipä) tulee näyttää pitämättä näkymää tai viittaamatta siihen.

Kuinka voin ilmoittaa joillekin luokille viittaamatta niihin?

Tämä voidaan tehdä kolmella eri tavalla:

  • Kaksisuuntaisen tiedonsidon käyttö
  • Myös LiveDatan kanssa
  • RxJavan käyttö

Kaksisuuntainen tietojen sidonta:

Kaksisuuntainen tiedonsidonta on tekniikka, jolla objektit yhdistetään XML-asetteluun, jotta objekti ja asettelu voivat lähettää tietoja toisilleen.

Esimerkissämme ViewModel voi lähettää tietoja asettelu- ja näyttömuutoksiin.

Tätä varten tarvitsemme BindingAdapterin ja mukautetun XML-määritteen.

BindingAdapter voi odottaa toimintojen muutoksia.

Lisätietoja kaksisuuntaisesta tietojen sitomisesta alla olevan esimerkin avulla.

Esimerkki MVVM-projektirakenteesta Androidissa:

Lisää tiedonsidontakirjasto

Lisää seuraava koodi rakennukseesi. Gradle-tiedosto:

android { dataBinding { käytössä = tosi } }

Tämä ominaisuus mahdollistaa tietojen sitomisen sovelluksessasi.

Lisää riippuvuuksia

Lisää seuraavat riippuvuudet koontiversioosi. Gradle-tiedosto:

Toteutus “android.arch.lifecycle: Laajennukset: 1.1.0”

Malli

Sisältää käyttäjän sähköpostiosoitteen ja salasanamallin. User.java-luokka toimii seuraavasti:

Paketti com. Journaldev. androidmvvmbasics. malli; public class User { private String email; yksityinen merkkijono salasana; julkinen käyttäjä (sähköpostimerkkijono, merkkijonon salasana) { this . sähköposti = sähköposti; . salasana = salasana; } public void setEmail (String email) { this. sähköposti = sähköposti; } public String getEmail () { return email; } public void setPassword (merkkijonon salasana) { this. salasana = salasana; } public String getPassword () { return Password; } }

Kaksisuuntainen tiedonsidonta antaa meille mahdollisuuden linkittää XML-asettelussa olevia objekteja niin, että objekti voi lähettää tiedot asetteluun ja päinvastoin.

Nt-syntaksi kaksisuuntaiselle datasidokselle @ = {muuttuja

layout

Activity_main.xml:n koodi on seuraava:

xml version = “1.0” sitova = “utf-8”?> < data > < muuttujan nimi = " viewModel " type = " com.journaldev.androidmvvmbasics.viewmodels.LoginViewModel " /> data > < ScrollView android: layout_width = " match_parent " android: layout_height = "match_parent " > < LinearLayout Android: Layout_width = "match_parent" Android: Layout_height = "Wrap_Content" Android: Layout_Gravity = "Keski" Android: Layout_Margin = "8dp" Android: Muokkaa Android" > “Vertex Orientation : ID = “@ + ID / inEmail” Android: layout_width = “match_parent” Android: layout_height = “wrap_content” Android: hint = “Sähköposti” Android: inputType = “textEmailAddress” Android: padding = “8dp” Android: text = ” @={viewModel.userEmail}”/> < Android-painike: layout_width = "match_parent" android: layout_height = "wrap_content" Android: layout_marginTop = "8dp " =android: onClick "@ {() -> viewModel.onLoginClicked ()}” android: text = “LOGIN” bind: toastMessage = “@ {viewModel.toastMessage}” /> LinearLayout > ScrollView > asettelu >

Tässä ViewModelimme yhdistää tiedot View-näkymään. ViewModel.onLoginClicked () () Tämä painike on määritelty ViewModelissa ja sitä kutsutaan nimellä Lambda.

ViewModel

LoginViewModel.java-kirjautumiskoodi on seuraava:

Paketti com. Journaldev. androidmvvmbasics. tarkastella malleja; Tuo Android. Tietojen sitominen. Base Observable ; Tuo Android. Tietojen sitominen. Sidottava; Tuo Android. Teksti. TextUtils ; Tuo Android. util . kuvio ; importcom. Android. Tietojen sitominen. Kirjasto . baseAdapterit. BR; Tuo com.journaldev. androidmvvmbasics. malli. käyttäjä ; public class LoginViewModel laajentaa BaseObservable { yksityinen käyttäjä käyttäjä; private String successMessage = “Kirjautuminen onnistui”; private String errorMessage = “Virheellinen sähköpostiosoite tai salasana”; @Sidottava yksityinen merkkijono toastMessage = null ; public String getToastMessage () { return toastMessage; } yksityinen void setToastMessage (merkkijono toastMessage) { this. toastMessage = toastMessage; notifyPropertyChanged (BR. toastMessage); } public void setUserEmail (String email) { user. setEmail(sähköposti); notifyPropertyChanged (BR . userEmail); } @Sidottava julkinen merkkijono getUserEmail () { Palauta käyttäjä. getEmail(); } @Sidottava julkinen merkkijono getUserPassword () { paluu käyttäjä. Hanki salasana(); } public void setUserPassword (merkkijonon salasana) { käyttäjä. setPassword(salasana); notifyPropertyChanged (BR . userPassword); } public LoginViewModel () { käyttäjä = uusi käyttäjä (“”, “”); } public void onLoginClicked () ( if ( isInputDataValid ()) setToastMessage (successMessage); else setToastMessage (errorMessage); } public boolean isInputDataValid () { return ! TextUtils . isEmpty ( getUserEmail ()) && EMAILUADER (. )).vastaa () && getUserPassword ().length ()> 5 ; } }

Yllä oleva luokka voi myös laajentaa ViewModelia. Mutta tarvitsemme BaseObservablen, koska se muuntaa tiedot streamiksi ja saa ilmoituksen, kun toastMessage-ominaisuus muuttuu.

XML-muodossa määritetylle mukautetulle toastMessage-attribuutille meidän on määritettävä asettajat ja getterit.

Asettajan sisällä ilmoitamme Tarkkailijalle, että tiedot ovat muuttuneet. Näkemyksemme (toimintamme) voi määrittää vastaavan toiminnan.

MainActivity.javan luokkakoodi on seuraava:

Paketti com. Journaldev. androidmvvmbasics. näkymät; Tuo Android. Tietojen sitominen. BindingAdapter ; Tuo Android. Tietojen sitominen. DataBindingUtil ; Tuo Android. Tuki . v7. sovellus. AppCompatActivity ; Tuo Android. os. Kimppu; Tuo Android. Näytä . Näytä ; Tuo Android. Widget .Toast ; importcom. Journaldev. androidmvvmbasics. R; importcom. Journaldev. androidmvvmbasics. Tietojen sitominen. ActivityMainBinding ; importcom. Journaldev. androidmvvmbasics. Katso mallit. LoginViewModel ; public class MainActivity laajentaa AppCompatActivityä {@Override protected void onCreate (Bundle savedInstanceState) {super. onCreate(savedInstanceState); ActivityMainBinding ActivityMainBinding = DataBindingUtil . setContentView(this, R.layout.activity_main); ActivityMainBinding. setViewModel( new LoginViewModel()); ActivityMainBinding. executePendingBindings(); } @BindingAdapter ({ “toastMessage” }) public static void runMe ( Näytä näkymä, merkkijonoviesti ) { if (viesti! = null ) Toast . makeText(view.getContext(), viesti, Toast.LENGTH_SHORT). näytä (); } }

DataBindingin ansiosta asettelun ActivityMainBinding-luokka luodaan automaattisesti. BindingAdapter-menetelmä aktivoituu, kun painikkeessa määritetyt toastMessage-ominaisuudet muuttuvat. On käytettävä samaa XML:ssä ja ViewModelissa määritettyä attribuuttia.

Yllä olevassa ohjelmassa ViewModel päivittää mallin seuraamalla muutoksia Viewissa. Malli voi myös päivittää näkymän ViewModelin kautta notifyPropertyChangedilla.

Näet yllä olevan ohjelman tuotoksen alta.

MvvM Androidissa

Voit ladata MVVM-koulutusprojektin DataBindingillä Androidissa seuraavasta linkistä.

Toinen esimerkki MVVM:stä Androidissa

Ohjelma on hyvin yksinkertainen. Se hakee suosituimmat Reddit-viestit JSON-sovellusliittymästään ja näyttää ne luettelossa.

Tässä esimerkissä käytetään seuraavia kirjastoja:

  • RxJava
  • Jälkiasennus
  • Tikari 2
  • Picasso
  • Android-merkinnät
  • Lombok

Voit nähdä tämän esimerkin seuraavasta linkistä:

Github (Mvvm ​​Reddit)

Diplomi:

Tässä artikkelissa opimme Androidin MVVM-arkkitehtuurista. Vertasimme sitä MVC-arkkitehtuuriin ja MVP-arkkitehtuuriin. Olemme tutustuneet MVVM:n ominaisuuksiin ja suorituskykyyn ja todenneet, että sen käyttö on erittäin hyödyllistä. Ja antaa yleisen polun sovellukseemme ja helpottaa uuden toiminnon lisäämistä ohjelmaamme, varmistaa korkean testattavuuden ja parantaa ohjelman ylläpitoa.