Google I / O 2017 Aftermath componenten bouwen die levenscyclusbewust zijn

Zoals gewoonlijk zag de Google I / O van dit jaar tal van Android-gerelateerde aankondigingen.

In deze serie snelle tips gaan we enkele software-updates en nieuwe releases die u kunt krijgen eens nader bekijken. vandaag

In deze eerste post gaan we kijken naar een verzameling bibliotheken die de pijn willen wegnemen uit Lifecycle Management, door u een manier te bieden om levenscyclusbewuste componenten te bouwen die automatisch levenscyclusgebeurtenissen kunnen volgen en erop kunnen reageren. Ik zal ook een korte inleiding geven tot twee andere componenten die zijn ontworpen om te gebruiken met deze nieuwe levenscyclusbewuste componenten: LiveData en Room.

LifecycleOwner en LifecycleObserver

Respect voor de levenscyclus van uw Activiteits en Fragmentzus beslissend om een ​​succesvolle app te maken. Krijg deze basisprincipes verkeerd, en je krijgt de gevolgen van geheugenlekken waardoor je app achterloopt en mogelijk zelfs crasht.

Een ander terugkerend probleem dat u kunt tegenkomen met Lifecycle Management is het proberen de gebruikersinterface van uw app bij te werken wanneer de activiteit of het fragment zich niet in een geldige staat bevindt. Bijvoorbeeld, als een Activiteit ontvangt een terugbelverzoek nadat deze is gestopt, dan is het vrij waarschijnlijk dat uw app vastloopt. 

Om u te helpen bij het voorkomen van alle problemen die gepaard gaan met lifecycle management, heeft Google een nieuwe set levenscyclusbewuste componenten aangekondigd die de levenscyclus van een activiteit of fragment kunnen volgen en hun gedrag dienovereenkomstig kunnen aanpassen.

Je kunt deze Android-architectuurcomponenten vandaag nog openen via de Maven-repository van Google. Ze zijn echter nog steeds in alfa, dus u moet enkele brekende wijzigingen verwachten vóór de 1.0-release. 

In het bijzonder, de Fragment en AppCompatActivity klassen kunnen momenteel het nieuwe niet implementeren LifecycleOwner interface. U moet de tijdelijke gebruiken LifecycleActivity en LifecycleFragment klassen totdat de Android-architectuurcomponenten hun 1.0-release bereiken. Deze klassen worden beëindigd zodra de fragmenten en activiteiten van Android zijn bijgewerkt ter ondersteuning van de levenscycluscomponenten.

Om te beginnen met het experimenteren met deze componenten, moet je de Google Maven-repository toevoegen aan je projectniveau build.gradle het dossier:

allprojects repositories jcenter () // Voeg de Google Maven-repository // maven url 'https://maven.google.com' toe

Open vervolgens je moduleniveau build.gradle bestand en voeg het volgende toe:

afhankelijkheden compile fileTree (dir: 'libs', include: ['* .jar']) compileer "android.arch.lifecycle: runtime: 1.0.0-alpha1" compileer "android.arch.lifecycle: extensions: 1.0.0 -alpha1 "annotationProcessor" android.arch.lifecycle: compiler: 1.0.0-alpha1 "

Er zijn een paar Android-architectuurcomponenten, maar in dit artikel gaan we ons alleen concentreren op de volgende twee:

  • LifecycleOwnerDit is iets dat een levenscyclus heeft, zoals een Activiteit of Fragment.
  • LifecycleObserverDit is een klasse die de levenscyclusstatus van een component kan controleren via geannoteerde methoden. Deze methoden worden aangeroepen wanneer het bijbehorende onderdeel de bijbehorende levenscyclusstatus bereikt.

Door de code die controleert op en reageert op levenscyclusgebeurtenissen naar een afzonderlijke te verplaatsen LifecycleObserver, je kunt de levenscyclus-gerelateerde methoden van je activiteit of fragment (zoals onStart en onStop) van uit de hand lopen van ballonvaren, waardoor uw code veel menselijker leesbaar is.

In het volgende voorbeeld zijn we aan het implementeren LifecycleObserver, en gebruik vervolgens de @OnLifeCycleEvent om te reageren op verschillende lifecycle-evenementen:

import android.arch.lifecycle.Lifecycle; importeer android.arch.lifecycle.LifecycleObserver; import android.arch.lifecycle.OnLifecycleEvent; public class SecondActivity implementeert LifecycleObserver ... lifecycle.addObserver (this);  @OnLifecycleEvent (Lifecycle.Event.ON_START) void start () // Wanneer de activiteit een ON_START-status invoert, doet u iets // @OnLifecycleEvent (Lifecycle.Event.ON_STOP) void stop () // Wanneer de activiteit binnenkomt een ON_STOP-status, doe iets // // registreer de LifecycleObserver // @OnLifecycleEvent (Lifecycle.Event.ON_DESTORY) ongedaan maken wanneer de activiteit is vernietigd () lifecycle.removeObserver (this); 

Vervolgens in de Activiteit je wilt controleren, uitbreiden LifecycleActivity om toegang te krijgen tot de LifecycleObserver informatie:

openbare klasse MainActivity verlengt LifecycleActivity 

Veel bewerkingen kunnen alleen worden uitgevoerd als een fragment of activiteit zich in een specifieke staat bevindt. Je kunt gebruiken lifecycle.getState om snel en eenvoudig de huidige status van het onderdeel te controleren en voer dan alleen de actie uit als het onderdeel in de juiste staat verkeert:

if (lifecycle.getState (). isAtLeast (STARTED)) 

Actuele gegevens

Actuele gegevens is een waarneembare gegevenshouder die een reeks gebeurtenissen blootlegt die u kunt observeren.

Het belangrijkste verschil tussen Actuele gegevens en andere waarneembare dingen, zoals RxJava, is dat Actuele gegevens is op de hoogte van de Android-levenscyclus. Actuele gegevens respecteert de levenscyclusstatus van uw activiteiten, fragmenten en services en beheert abonnementen voor u.

Cruciaal is dat als de levenscyclus van een waarnemer niet actief is, de waarnemer niet op de hoogte wordt gebracht van wijzigingen in de Actuele gegevens, het voorkomen van applicatie-crashes die kunnen optreden wanneer u updates naar gestopte componenten probeert te pushen.

Gebruiken Actuele gegevens, je hoeft het alleen maar te vertellen Activiteit dat u enkele gegevens binnen de levenscyclus wilt observeren:

public class MyActivity breidt LifecycleActivity uit public void onCreate (Bundle savedState) LiveData gebruikersgegevens; // Haal gebruikersgegevens ergens vandaan // userData.observe (this, user -> ); 

Zodra de activiteit begint, begint het de Actuele gegevens, en je waarnemer ontvangt een update wanneer de waarde daarvan dat is Actuele gegevens veranderingen. Als het Activiteit wordt vernietigd, dan wordt het abonnement automatisch verwijderd.

Als een Activiteit wordt gestopt als gevolg van een configuratiewijziging, en vervolgens het nieuwe exemplaar Activiteit ontvangt de laatste beschikbare waarde van de Actuele gegevens.

Actuele gegevens deelt enkele overeenkomsten met RxJava, maar het officiële woord van Google I / O is dat als u bekend bent met RxJava, u uw Android-projecten met Actuele gegevens, omdat het is ontworpen om eenvoudig, snel en lichtgewicht te zijn en goed te integreren is met het Android-framework. U kunt dan RxJava-functies toevoegen als u extra reactieve programmeerfunctionaliteit nodig hebt.

Als je het wilt gebruiken Actuele gegevens met de RxJava 2-bibliotheek open je je moduleniveau build.gradle bestand en voeg het volgende toe:

compileren "android.arch.lifecycle: reactivestreams: 1.0.0-alpha1" 

U kunt dan de volgende methoden gebruiken: 

  • toPublisherPast de Actuele gegevens stream naar ReactiveStreams Uitgeverij

openbare statische  Uitgeverij toPublisher (laatste LifecycleOwner-levenscyclus, laatste LiveData actuele gegevens)  
  • fromPublisherCreëert een waarneembaar Actuele gegevens streamen van een ReactiveStreams-uitgever. 

openbare statische  Actuele gegevens fromPublisher (laatste uitgever uitgeverij)

The Room Library

Hoewel het Android-framework ingebouwde ondersteuning biedt voor het werken met onbewerkte SQL-inhoud, zijn deze API's vrij laagdrempelig en tijdrovend om te implementeren.

De nieuwe bibliotheek van Google belooft een aantal van de onderliggende implementatiegegevens van het werken met onbewerkte SQL-tabellen en -query's weg te abstraheren. Het moet ook helpen de hoeveelheid boilerplate-code die u moet schrijven te verminderen om SQL-query's naar Java-gegevensobjecten te converteren, en het bevat een Migratie klasse die u kunt gebruiken om uw app bij te werken zonder de gegevens van de gebruiker te verliezen. 

Als u Room wilt gebruiken, opent u uw moduleniveau build.gradle bestand en voeg het volgende toe aan de afhankelijkheden sectie:

compileer "android.arch.persistence.room:runtime:1.0.0-alpha1" annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1" 

Bij het uitvoeren van query's wilt u meestal dat uw gebruikersinterface automatisch wordt bijgewerkt wanneer de gegevens worden gewijzigd. met Room kunt u dit bereiken door een retourwaardetype van te gebruiken Actuele gegevens.

Ten slotte, als u RxJava gebruikt, kunnen uw roomqueries ook RxJava 2's retourneren Uitgeverij en flowable voorwerpen. Om RxJava met Room te gebruiken, moet je je moduleniveau openen build.gradle bestand en voeg het volgende toe aan de afhankelijkheden sectie:

compileer 'android.arch.persistence.room:rxjava2:1.0.0-alpha1' 

Conclusie

In deze snelle tip heb ik je laten zien hoe je de Android-levenscyclus beheert, met behulp van LifecycleOwner en LifecycleObserver, en heb je kennisgemaakt met twee extra componenten die je naast het Lifecycle-project wilt gebruiken.. 

In de volgende tip gaan we kijken naar Google's plannen om Android Wear UI-componenten samen te voegen met de Android-ondersteuningsbibliotheek, evenals enkele toevoegingen aan Android Wear-complicaties. 

Bekijk in de tussentijd enkele van onze andere zelfstudies en onze videocursussen over de ontwikkeling van Android-apps!