Kuidas LiveData koos reaalajas kasutada

Kui olete Androidi arendaja ja te pole Google IO17-st saadik elanud kivi all, olete kahtlemata näinud palju põnevust ja arvukalt ajaveebi postitusi, mis käsitlevad Androidi arhitektuurikomponente.

Nende uute komponentide (ViewModel, Lifecycle, LiveData ja Room) võimsuse ja kasulikkuse osas on tõepoolest palju põnevat.

Reaalajas andmevood

Minu vaatevinklist on LiveData rivistuse kõige põnevam osa. On fantastiline, kui Google võtab nüüd kasutusele reaalajas andmete automaatse värskendamise mõiste. Sama vinge on näha, kuidas nad on integreerinud LiveData otse uude SQLite ORM-i (tuba).

See muudab LiveData võimsuse kohese nägemise lihtsaks, kuid LiveData kujunduses meeldib mulle kõige rohkem see, et Google on muutnud LiveData kasutamise üldiseks ja arendajatele avatud kasutamiseks paljudel muudel kasutusjuhtudel, näiteks:

  • Võrgu oleku juhtimine ja teadlikkus
  • LiveData tagastamine koos modifitseerimisega
  • Rakenduse oleku haldamine

Valdkond + LiveData

LiveData paindlik olemus võimaldab seda hõlpsalt integreerida ka muudesse kolmandate osapoolte teekidesse! Realmi insenerina on see minu jaoks väga põnev, kuna see tähendab, et saan RealmResultsi LiveData-na mähkida ja kasutada nagu iga teist LiveData tükki.

Sellel on vähemalt kaks täiendavat eelist.

See muudab arendajatel andmemuutustele reageerimise veelgi lihtsamaks, kuna nad ei pea enam oma tegevuses onStart () -meetodis RealMResults muudatustListener registreerima ja onStop () -il registreerima. Pigem võib see juhtuda rakendusega Realm-LiveData automaatselt automaatselt, kui omav tegevus algab ja lõpetab selle jälgimise.

Teine eelis on see, et see võimaldab RealmResultsil osaleda LiveData teisendustes. Teisendused on suurepärased, kuna need võimaldavad teil muuta mis tahes väga spetsiifilist LiveData, näiteks LiveData , teie hoidla või ViewModel kihil, aluseks oleva allika täiesti agnostiliseks, näiteks LiveData aktiivsuse kihil. Selle saate ilma, et loobuksite reaalajas automaatse värskendamise olemusest. See hoiab teie rakenduse erinevad kihid isoleerituna, mis muudab nende koostamise, värskendamise ja testimise lihtsamaks.

Alustamine

Arhitektuurikomponentide integreerimise valdkonda täieliku juhendamise ja näidisprojekti saamiseks lugege seda teist postitust, millest ma kirjutasin, kuid see kiire näide peaks andma teile alustamiseks üldise idee.

1. Looge oma RealmResults jaoks LiveData ümbris.

// See töötab kõigi teie projekti RealmModeli tulemuste jaoks
avaliku klassi RealmLiveData  laiendab LiveData > {
privaatsed RealmResults  tulemused;
    privaatfinaal RealmChangeListener  kuulaja =
        uus RealmChangeListener > () {
            @Ülesõit
            avalik tühine onChange'is (RealmResults  tulemused) {
                setValue (tulemused);
            }
    };
    avalik RealmLiveData (RealmResults  realmResults) {
        tulemused = realmResults;
    }
    @Ülesõit
    kaitstud tühine onActive () {
        tulemused.addChangeListener (kuulaja);
    }
    @Ülesõit
    kaitstud tühine onInactive () {
        results.removeChangeListener (kuulaja);
    }
}

2. Kasutage seda RealmResultsi mähkimiseks, mis on paljastatud Realm Dao või hoidla kihist.

avalik RealmLiveData  findLoansByNameAfter (stringi kasutajanimi, kuupäev pärast) {
    naase asLiveData (realm.where (laenuklass))
            .like ("kasutajanimi.nimi", kasutajanimi)
            .greaterThan ("endTime", pärast)
            .findAllAsync ());
    // Async jookseb tõmbe põhilõnga juurest ja naaseb
    // tulemused nagu LiveData tagasi peamiseks.
}

3. Lõpuks kasutage seda nagu ka teisi oma ViewModeli LiveData, kaardistades selle aktiivsuse kihi jaoks mõne üldisemaga ja tellides selle oma tegevusest.

// ViewModel
avaliku klassi LoanViewModel laiendab ViewModelit {
    privaatvaldkond;
    
    avalikud LiveData  laenud;
    // LiveData tellitud tegevus 
    privaatne tühine tellimusToMikesLoansSinceYesterday () {
        RealmLiveData  laenud = aizdevDao (valdkond)
                 .findLoansByNameAfter ("Mike", hankige eilne päev ());
        laenud = Transformations.map (laenud, uus funktsioon () {...});
    }
    ...
}
// Tegevus
avalik klass LoanActivity laiendab elutsüklitegevust {
  
    kaitstud tühine onCreate (Bundle savedInstanceState) {
        ...
        viewModel.loans.observe (see, uus vaatleja  () {
            avalik tühine on muudetud (stringi tulemus) {
                updateUI (tulemus)
            }
        });
       ...
    }
   ...
}

4. (Valikuliselt) Puistake natuke Kotlini sisse ja tundub, nagu oleksid Androidi arhitektuurikomponendid kogu aja seal olnud!

// Kasuta kui
// realm.loanDao () Kotlinis
// JavaDay laenDao (valdkond)
lõbus Realm.loanDao (): LoanDao = LoanDao (see)
// Kasuta kui
// realmResults.asLiveData () Kotlinis
// Java uus RealmLiveData (valdkond)
lõbus  RealmResults  .asLiveData () = RealmLiveData  (see)

Arhitektuurikomponentide mõju

See tähendab arendajatele, kellele meeldib Realm selle lihtsa API, rikkaliku teavitussüsteemi ja reaalajas andmete sünkroonimise kaudu, see, et saadaval on kõik Androidi arhitektuurikomponentide, ViewModels, Lifecycle, LiveData ja isegi DAO-de kaudu kapseldatud andmetele ligipääs. loobumata funktsioonidest, mida nad on armastanud!