Home / Android-Entwicklung / Das Android Arsenal – Eventbusse

Das Android Arsenal – Eventbusse

Vereinfacht die gemeinsame Nutzung von Feldern und die Kommunikation zwischen Android-Komponenten mit benutzerdefinierten Bereichen, die den Lebenszyklus berücksichtigen.

Android-Komponenten sind die wesentlichen Bausteine ​​einer Android-Anwendung. Diese unabhängigen Komponenten sind lose gekoppelt. Der Vorteil ist, dass sie wirklich unabhängig voneinander wiederverwendbar sind, aber es schwierig macht, miteinander zu kommunizieren.

Das Ziel dieser Bibliothek besteht darin, die Kommunikation und den Datenfluss zwischen Komponenten wie Aktivität, Fragment, Services usw. zu vereinfachen. Durch die Verwendung von benutzerdefinierten Bereichen, die sich auf den Lebenszyklus beziehen, können Entwickler nach ihrem Geschmack einen Bereich für Daten festlegen. [19659004] Wann ist das sinnvoll?

Wenn wir einige unveränderliche Daten speichern müssen und diese als dieselben Daten an den anderen Komponenten synchronisiert werden müssen. Zum Beispiel gibt es Aktivität A Aktivität B Aktivität C . Und wir müssen in allen Aktivitäten A – C dieselben Daten verwenden, die geändert werden können. Dann sollten wir die Paketdaten A an B und B an C übergeben und die geänderten Daten durch onActivityResult rückgängig machen.

Wie wäre es dann mit der Kommunikation mit Fragmenten? Wir können das Problem lösen, indem wir eine Schnittstelle, ein Singleton-Muster, ein Beobachter-Muster usw. implementieren, aber der Datenfluss wäre ziemlich kompliziert. Chamber vereinfacht die Kommunikation zwischen den Inhabern von Chamber-Gültigkeitsbereichen.

Download

Gradle

Fügen Sie Ihrem Modul den Abhängigkeitscode build.gradle hinzu.

 ] Abhängigkeiten 
 {
    Implementierung  " com.github.skydoves: chamber: 1.0.0 " 

} 

Verwendung

Chamber ist ein Datenbehälter mit Gültigkeitsbereich mit benutzerdefinierten Gültigkeitsbereichen, die lebenszyklusabhängig sind.

ChamberScope

Die grundlegende Verwendung ist das Erstellen einer benutzerdefinierten Bereichsanmerkung mit einer @ChamberScope -Anmerkung. Mit @ChamberScope werden benutzerdefinierte Bereiche erstellt, die den Lebenszyklus berücksichtigen. Jeder Bereich ist ein temporärer Datenbehälter mit ChamberField-Daten- und -Lebenszyklusstapel. Es sollte eine Klasse (Aktivität, Fragment, Repository oder eine beliebige Klasse) mit Anmerkungen versehen werden, die ChamberField-Felder aufweist.

 @ChamberScope 
 @Retention  ( AnnotationRetention  RUNTIME 
)
 Anmerkung  Klasse  UserScope 

ChamberField

ChamberField ist eine interaktive Klasse für den internen Chamber-Dateninhaber und einen LifecycleObserver, der beobachtet werden kann. Es sollte mit der Annotation @ShareProperty verwendet werden, die einen Schlüsselnamen hat. Wenn wir denselben synchronisierten Wert für denselben benutzerdefinierten Bereich und verschiedene Klassen verwenden möchten, sollten wir denselben Schlüssel verwenden.

 @ShareProperty  ( " name " )  //  name ist ein Schlüsselname. 
 var  username  =  ChamberField  ( " skydoves " )  //  ChamberField kann mit jedem Objekt initialisiert werden. 

setValue

Mit der Methode setValue können wir den Wert von ChamberField ändern. [19659034] username.setValue ( " Benutzername wurde geändert " )

postValue

Sendet eine Aufgabe an einen Hauptthread, um den angegebenen Wert festzulegen. Wenn Sie also folgenden Code im Hauptthread ausführen lassen:

 username.postValue ( " a " 
)
username.setValue ( " b " ) 

Der Wert b würde zuerst festgelegt und später vom Hauptthread mit dem Wert [19459015überschrieben] a.

beobachten

Wir können beobachten, dass der Wert mit der Methode beobachten geändert wird.

 username.observe {
  log ( " Daten werden in $ it geändert " 
)
} 

ShareLifecycle

Chamber synchronisiert das ChamberField mit demselben Bereich und demselben Schlüssel. Verschiebt außerdem einen LifecycleOwner in den Lifecycle-Stack der Kammer. Hier ist ein Beispiel mit MainActivity und SecondActivity.

MainActivity

Chamber erstellt einen @UserScope -Datenbehälter. Wenn die Chamber.shareLifecycle-Methode aufgerufen wird, wird das Namensfeld mit dem Spitznamenschlüssel von Chamber verwaltet, und Chamber beobachtet den Lebenszyklusstatus von MainActivity.

 @UserScope  //  benutzerdefinierter Bereich 
 Klasse  MainActivity :  AppCompatActivity 

 () {

   @ShareProperty  ( " Spitzname " 
)
   privat  var  name  =  ChamberField  ( " skydoves " 

)

   Überschreiben  Spaß  bei Erstellen  ( SavedInstanceState :  Bundle? 
) {
     super 
 .onCreate (savedInstanceState)
    setContentView ( R 

 .layout.activity_main)

     Chamber  .shareLifecycle (scopeOwner  =  this lifecycleOwner  =  this 

)

    name.value  =  " Name Wert wird geändert " 



    startActivity ( SecondActivity  ::  class 

 .java)
  }
} 

MainActivity -> SecondActivity

MainActivity startet SecondActivity mit startActivity. SecondActivity wird von Chamber aktualisiert, wenn shareLifecycle-Methode aufgerufen wird. Chamber beobachtet den Lebenszyklusstatus von SecondActivity. Und der Wert des Namensfelds in der

 @UserScope 
 Klasse  SecondActivity :  AppCompatAct 

 () {

   @ShareProperty  ( " Spitzname " 
)
   privat  var  name  =  ChamberField  ( " skydoves " 

)

   Überschreiben  Spaß  bei Erstellen  ( SavedInstanceState :  Bundle? 
) {
     super 
 .onCreate (savedInstanceState)
    setContentView ( R 

 .layout.activity_second)

     Chamber  .shareLifecycle (scopeOwner  =  this lifecycleOwner  =  this 

)

     //  Der Wert ist "Name Wert wird geändert". weil es in MainActivity eingestellt wurde. 

    log ( " name value is ..  $ {username.value} " 

)

    name.value  =  " geändert in SecondActivity " 





    Fertig()
  }
} 

Der Prozess zum Verlassen des Gültigkeitsbereichs

SeondActivity -> MainActivity

Die Methode finish wurde in SecondActivity aufgerufen und wir kehren zurück zu die MainActivity . Wann und wann Der Lebenszyklusstatus von MainActivity ist onResume, Chamber aktualisiert den Wert von ChamberField in MainActivity. Der Lebenszyklusstatus von SecondActivity ist onDestroy, Chamber wird aktualisiert nicht mehr mit dem ChamberField von SecondActivity interagieren und den Lebenszyklusstatus nicht beobachten.

 @UserScope 
 class  MainActivity : 

AppCompatActivity [1945] 

 {

   @ShareProperty  ( " Spitzname " 
)
   privat  var  name  =  ChamberField  ( " skydoves " 

)

   Überschreiben  Spaß  bei Erstellen  ( SavedInstanceState :  Bundle? 
) {
     super 
 .onCreate (savedInstanceState)
    setContentView ( R 

 .layout.activity_second)
    
     //  Der Wert wird "in SecondActivity geändert". weil es in SecondActivity gesetzt wurde. 


    name.observe {
      log ( " name value is ..  $ {username.value} " 


)
    }
  }
} 

MainActivity beenden

Nachdem alle Lifecycle-Besitzer zerstört wurden (alle Lifecycle-Besitzer werden aus dem Lifecycle-Stack von Chamber entfernt), wird der benutzerdefinierte Bereichsdatenbereich im internen Datenbehälter gelöscht. [19659015] Verwenden eines Repository-Musters

Die UI-Komponenten sollten sich in ihrer Architektur auf UI-Arbeiten beziehen. Daher wird die Implementierung einer Chamber-Scope-Klasse in einer Repository-Klasse stärker bevorzugt.

 @UserScope  19659026] //  benutzerdefinierter Bereich 
 Klasse  MainActivityRepository  ( LifecycleOwner :  LifecycleOwner 

) {

   @ShareProperty  ( " Spitzname " 
)
   var  name  =  ChamberField  ( " skydoves " 

)

   init 
 {
     //  Injizieren von Felddaten und Hinzufügen eines LifecycleOwners zum UserScope-Scope-Stack. 
 Chamber  .shareLifecycle (scopeOwner  =  this  = 



 LebenszyklusBesitzer)
  }
}

 Klasse  MainActivity :  AppCompatActivity 

 () {

   privat  val  Aufbewahrungsort  =  MainActivityRepository  ( this 

)

   //  ... 

} 

Findest du diese Bibliothek hilfreich? ❤️

Unterstützen Sie es, indem Sie sich Sternguckern für dieses Repository anschließen. ⭐️

Design License

Ich habe Flussdiagramme mit UXFlow entworfen. Es folgt Attribution 4.0 International (CC BY 4.0).












 Copyright 2019 skydoves (Jaewoong Eum)

Lizenziert unter der Apache-Lizenz, Version 2.0 (die "Lizenz");
Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden.
Eine Kopie der Lizenz erhalten Sie unter

   http://www.apache.org/licenses/LICENSE-2.0

Sofern nicht gesetzlich vorgeschrieben oder schriftlich vereinbart, Software
unter der Lizenz vertrieben wird auf einer "AS IS" -Basis verteilt,
OHNE GARANTIEN ODER BEDINGUNGEN JEGLICHER Art, entweder ausdrücklich oder stillschweigend.
In der Lizenz finden Sie die spezifische Sprache für die Berechtigungen und
Einschränkungen unter der Lizenz. 

.

About AndroidWeltEditor

Check Also

An introduction to Android GPU Inspector

If you want your game or app to stand out in the Google Play Store, …

Leave a Reply

Your email address will not be published. Required fields are marked *