Att bygga en Android-app som har flera aktiva komponenter som kommunicerar med varandra kan bli tråkig. För att spara tid, hamnar utvecklarna ofta med tätt kopplade komponenter i sina appar. EventBus är ett populärt open source-bibliotek som skapades för att lösa detta problem med hjälp av utgivare / abonnent mönster.
Med EventBus-biblioteket kan du skicka meddelanden från en klass till en eller flera klasser på bara några rader av kod. Dessutom är alla involverade klasser helt avkopplade från varandra, vilket leder till kod som är mindre komplex och enklare att underhålla och felsöka.
I det här snabba tipset kommer du att lära dig hur du använder EventBus-biblioteket genom att bygga en enkel Android-applikation som visar laddningsstatus för enheten. Eftersom ändringar i laddningsstatus är systemhändelser kommer appen att ha en Aktivitet
som behöver ta emot information från en BroadcastReceiver
-Det perfekta scenariot för att använda en händelsebuss.
Se till att du har Eclipse ADT Bundle. Du kan ladda ner den från Android Developer-webbplatsen.
Starta Eclipse och skapa en ny Android-applikation. Namn på ansökan EventBusSample
. Välj ett unikt paketnamn och ställ in Minimikrav SDK till Android 2,2 och den Mål SDK till Android 4,4.
Vi ska skapa Aktivitet
oss själva, så avmarkera Skapa aktivitet och klicka Avsluta.
Den här appen har en BroadcastReceiver
som svarar på följande åtgärder:
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
Namn på BroadcastReceiver
ChargingReceiver
och förklara det i AndroidManifest.xml
fil.
Appen har en Aktivitet
för att visa laddningsstatus. Namnge det DisplayActivity
och deklarera det enligt nedan.
Hämta den senaste versionen av EventBus-biblioteket som en JAR från Maven Central och lägg till JAR i ditt projekt libs
katalog.
ChargingEvent
KlassHändelser på evenemangsbussen är ingenting annat än föremål som innehåller den information som behöver kommuniceras. Låta ChargingEvent
Var namnet på den klass som innehåller informationen som skickats från BroadcastReceiver
till Aktivitet
. Det här är en enkel klass som bara har en Sträng
att representera informationen. Det har också en konstruktör att ställa in värdet på strängen och en accessor för att få sitt värde.
Skapa en ny fil med namnet ChargingEvent.java och lägg till följande kod till den:
paketet com.hathy.eventbussample; offentlig klass ChargingEvent private String data; offentlig laddningEvent (strängdata) this.data = data; public String getData () return data;
BroadcastReceiver
KlassSkapa en ny klass som heter ChargingReceiver
som sträcker sig BroadcastReceiver
. Den här klassen använder händelsebussen för att publicera meddelanden. Den har en variabel som heter buss
, som refererar till bussen som skapats av EventBus-biblioteket. Bussen är en singleton och du måste använda getDefault
metod att hänvisa till det.
I onReceive
metod skapar vi en ny instans av ChargingEvent
klass och lägg till vårt meddelande till det. Här är ett provmeddelande:
@ 14: 23: 20 denna enhet började ladda.
För att generera detta meddelande behöver vi göra följande:
Tid
klass för att ställa in den tid då händelsen inträffade.Intent.ACTION_POWER_CONNECTED
, enheten laddas. Om det är Intent.ACTION_POWER_DISCONNECTED
, enheten är urladdning.När ChargingEvent
objektet har rätt information, den publiceras på evenemangsbussen med posta
metod. Genomförandet av ChargingReceiver
klassen ska nu se ut så här:
paketet com.hathy.eventbussample; importera de.greenrobot.event.EventBus; importera android.content.BroadcastReceiver; importera android.content.Context; importera android.content.Intent; importera android.text.format.Time; public class ChargingReceiver utökar BroadcastReceiver privat EventBus bus = EventBus.getDefault (); @Override public void onReceive (Context context, Intent intent) ChargingEvent event = null; // Hämta nuvarande tid Tid nu = ny Tid (); now.setToNow (); String timeOfEvent = now.format ("% H:% M:% S"); String eventData = "@" + timeOfEvent + "den här enheten startade"; om (intent.getAction (). motsvarar (Intent.ACTION_POWER_CONNECTED)) event = new ChargingEvent (eventData + "charging."); annars om (intent.getAction (). equals (Intent.ACTION_POWER_DISCONNECTED)) event = new ChargingEvent (eventData + "urladdning."); // Lägg till händelsen bus.post (händelse);
Som du kan se är det bara en enda kodkod att publicera meddelanden till evenemangsbussen. Dessutom behöver utgivaren inte veta något om abonnenten (erna).
DisplayActivity
KlassSkapa en ny klass som heter DisplayActivity
. Den här klassen är ansvarig för att visa meddelanden av händelserna som publiceras på evenemangsbussen.
Denna klass har också en variabel som hänvisar till händelsebussen. Som EventBus-biblioteket följer singelmönstret, är förekomsten av evenemangsbussen tillgänglig för detta Aktivitet
är detsamma som det exemplar som finns tillgängligt för BroadcastReceiver
.
För att en klass ska kunna prenumerera på händelser på bussen, Registrera
Metoden åberopas. I vår Aktivitet
, vi kallar det i onCreate
metod.
På samma sätt, för att sluta ta emot händelser, avregistrera
Metoden åberopas. Vi kallar den här metoden i onDestroy
metod för att säkerställa att alla resurser frigörs.
De Aktivitet
har en mycket grundläggande layout, som bara innehåller en Textview
som visar meddelandena. Det är därför inte nödvändigt att skapa en layout för den. Vi använder helt enkelt Textview
som innehållsöversikt av Aktivitet
.
Vid denna punkt, genomförandet av DisplayActivity
klassen ska se så här ut:
paketet com.hathy.eventbussample; importera android.app.Activity; importera android.os.Bundle; importera android.widget.TextView; importera de.greenrobot.event.EventBus; public class DisplayActivity utökar aktivitet private EventBus bus = EventBus.getDefault (); privat textvyvy @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); view = new TextView (this); view.setTextSize (20f); view.setPadding (20, 20, 20, 20); view.setText ("Väntar på händelser ..."); setContentView (vy); // Registrera som abonnent bus.register (detta); @Override protected void onDestroy () // Avregistrera bus.unregister (detta); super.onDestroy ();
Varje klass som avser att ta emot händelser från evenemangsbussen ska innehålla en onEvent
metod. Namnet på den här metoden är viktigt, eftersom EventBus-biblioteket använder Java Reflection API för att komma åt denna metod. Den har en enda parameter som hänvisar till händelsen. I vårt fall kommer parametern att vara av typen ChargingEvent
.
Allt vi gör i denna metod lägger till det senast mottagna meddelandet till innehållet i Textview
. Genomförandet av onEvent
Metoden ser så här ut:
public void onEvent (ChargingEvent-händelse) view.setText (view.getText () + "\ n" + event.getData ());
Appen är nu redo att bli testad. Kompilera och kör det på en fysisk Android-enhet. När appen är klar med att starta, koppla ur nätsladden ett par gånger och koppla ur laddningsstatusen.
I den här handledningen har du lärt dig hur du använder EventBus-biblioteket och hur mycket det förenklar kommunikationen mellan klasserna. Biblioteket är optimerat för Android-plattformen och är väldigt lätt. Det innebär att du kan använda det i dina projekt utan att behöva oroa dig för din apps storlek. För att lära dig mer om EventBus-biblioteket, besök projektet på GitHub.