Håndtering af intern variabel tilstand i Android-udvikling

Når det kommer til at lære Android-udvikling, synes jeg, statsledelse er et af de mest forvirrende begreber at forstå. Android's aktivitetslivscyklus kan være en smule skræmmende selv for erfarne udviklere.

Mens jeg sætter pris på Googles liberale markedskrav for at få en app i butikken, er der ganske mange apps tilgængelige til download, der simpelthen ikke "får karakteren" i min bog. I de fleste af de tilfælde, jeg støder på, ligger problemet ikke i udviklerens applikationskoncept (skønt jeg har set en håndfuld apps, der bare er dårlige ideer), problemet ligger i vid udstrækning i programmer, der ikke klarer at håndtere de forskellige tilstande korrekt ændringer, der forekommer på Android-platformen. Resultatet af denne fiasko er den frygtede dialog "Aktivitet er stoppet uventet" og i sidste ende en tvungen lukning.

Statsledelse i en Android-applikation sker i tre lag. Først er der håndteringen af ​​UI, hvilket er især relevant under orienteringsændringer. Dernæst er der håndtering af interne applikationsvariabler. Sidst, men ikke mindst, er der specielle tilstandshåndteringsteknikker, som skal tages i betragtning, når du udfører langvarig I / O. Jeg dækkede UI-statusstyring og orienteringsændringer i et tidligere App Builder-indlæg. Denne tutorial fokuserer på håndtering af interne variabler.

Når det kommer til at følge med interne variabler på tværs af aktivitetsstarter, skal du huske disse punkter:

  • Standardhåndtereren i rammen håndterer automatisk at gemme og gendanne værdier i dine UI-widgets, forudsat at den pågældende widget har en Android-id defineret i dens layoutfil.
  • Overstyr metoden onSaveInstance for at bevare ikke-UI-værdier. Ring først til overordnede implementering, og tilføj derefter dine egne interne variabler til bundtet.
  • Medmindre du underklasserer din aktivitet eller kræver, at dine interne variabler gendannes, efter at din aktivitet er blevet initialiseret i sin helhed, skal du ikke tilsidesætte onRestoreInstanceState - brug bundtparameteren gemtInstanceState i standard onCreate-metoden.

Klar som mudder? Vær ikke bange, de punkter, der er overskrevet ovenfor, skal give større mening, når vi kommer ind i vores prøveansøgning. Når vi taler om det, er de gode folk hos TechRepublic altid rart nok til at gøre en zip-fil tilgængelig med hver af mine tutorials, så læsere som dig selv har mulighed for at importere projektet direkte til Eclipse. Denne uge er ingen undtagelse, og du kan downloade projektet her. I dette tilfælde anbefaler jeg dog stærkt at følge vejledningen først. De fleste uger betyder det ikke så meget, for det er det færdige produkt, vi er interesseret i, men denne uge er processen en vigtig del af afhentningen. Kun når du gradvis bygger appen, vil du virkelig sætte pris på, hvordan statsledelsen opnås.

1. Start et nyt Android-projekt i Eclipse-målretning version 1.6 eller nyere. Vi vil forsøge at oprette en meget simpel app til regnemaskintype til denne demonstration. Figur A er et kig på, hvad det vil se ud, så du har en idé om, hvad vi bygger. Figur A

2. Tilføj følgende xml i din mappe / layout.

 main.xml 

"1.0" encoding = "utf-8" ?>

"Http://schemas.android.com/apk/res/android"

android: orientering = "lodret"

android: layout_width = "fill_parent"

android: layout_height = "fill_parent"

android: gravitation = "center" >

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: text = "Hvad er min tilstand igen?"

android: paddingBottom = "20dip" />

android: orientering = "vandret"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content" >

android: id = "@ + id / første_nummer"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: text = "1" />

android: layout_width = "fill_parent"

android: layout_height = "wrap_content"

android: text = "x" />

android: id = "@ + id / sekundnummer"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: tekst = "5" />

android: layout_width = "fill_parent"

android: layout_height = "wrap_content"

android: text = "=" />

android: id = "@ + id / svar"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: aktiveret = "falsk" />

android: orientering = "vandret"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content" >

android: id = "@ + id / calc_button"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: text = "Multiplicer" />

android: id = "@ + id / history_button"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: text = "Historie" />

3. Nu er vi klar til at føje klassen Main.java til mappen / src. For at begynde med vil vi tilføje en temmelig standard på oprettelse, der blot kabler vores knapper, såvel som inkluderer en matrixliste til opbevaring af vores "historie" -log.

 Main.java- pakke com.authorwjf; import java.util.ArrayList; import android.app.Aktivitet; import android.app.AlertDialog; import android.os.Bundle; import android.view.View; 
 import android.view.View.OnClickListener; import android.widget.EditText; import android.widget.Toast; privat ArrayList mHistory = ny ArrayList (); 

@Override

public void onCreate (Bundle gemtInstanceState) { super .onCreate (gemtInstanceState); public class Main udvider Aktivitetsimplementeringer OnClickListener {

setContentView (R.layout. main );

Se v = findViewById (R.id. Calc_button );

v.setOnClickListener ( dette );

v = findViewById (R.id. history_button );

v.setOnClickListener ( dette );

}

}

4. Klassen implementerer en on-click-lytter, hvilket betyder, at vi er nødt til at tilsidesætte en on-click-handler. Skærmen har to knapper: en til at multiplicere værdierne sammen og en for at få vist indholdet i vores matrixliste. Vi kan udføre al logik for appen inde i on-click handler.

 Main.java 

@Override

public void onClick (Vis v) { if (v.getId () == R.id. calc_button ) {

EditText et = (EditText) findViewById (R.id. First_number );

int n1 = Heltal. parseInt (et.getText (). toString ());

et = (EditText) findViewById (R.id. andet nummer );

int n2 = Heltal. parseInt (et.getText (). toString ());

et = (EditText) findViewById (R.id. svar );

int- svar = n1 * n2;
 et.setText (Integer. toString (svar)); 

mHistory.add (Integer. toString (n1) + "x" +

Heltal. toString (n2) + "=" +

Heltal. toString (svar));

} andet {AlertDialog.Builder builder = ny AlertDialog.Builder ( dette ); StringBuilder msg = new StringBuilder (); hvis (mHistory.size ()> 0) { for ( int i = 0; i <mHistory.size (); i ++) {

msg.append (mHistory.get (i) + "\ n");

}

} andet {

msg.append ( "tom");

}

builder.setMessage (msg.toString ());

AlertDialog alarm = builder.create ();

alert.show ();

}

}
5. Lad os gå videre og give vores app en chance. Du skal være i stand til at multiplicere flere tal. Gå derefter videre og klik på historik-knappen. Figur B Figur B

6. Indtil videre, så god, men hvad sker der, når vi roterer telefonen og derefter rammer historiksknappen? De sidste værdier i felterne gendannes automatisk af rammen, men vores matrixliste er tom ( figur C ). Fig

7. Heldigvis kræves der ikke meget for at gemme tilstanden på vores matrixliste. Først skal vi tilsidesætte metoden til at gemme forekomsttilstand i Main.java på samme måde.

 Main.java 

@Override

beskyttet tomrum onSaveInstanceState (Bundle outState) { super .onSaveInstanceState (outState);

outState.putSerializable ("historie", mHistory);

Ristet brød. makeText ( dette, "Historik gemt.", Toast. LENGTH_SHORT ) .show (); }

8. Derefter skal vi bare ændre originalen på oprettelsesmetode for at kontrollere det indkommende bundt og forindlæse vores array-liste, hvis det er relevant.

 Main.java 

@Override

public void onCreate (Bundle gemtInstanceState) { super .onCreate (gemtInstanceState);

setContentView (R.layout. main );

if (gemtInstanceState! = null ) {mHistory = (ArrayList) gemtInstanceState.getSerializable ("historie");

}

Se v = findViewById (R.id. Calc_button );

v.setOnClickListener ( dette );

v = findViewById (R.id. history_button );

v.setOnClickListener ( dette ); }
9. Lad os nu prøve vores lille eksperiment igen. Noget ser anderledes ud? ( Figur D ) Figur D

Succes! Hvis du holder styr, har vi nu mestret to af de tre teknikker, der kræves for at administrere tilstand i vores Android-apps. Næste gang, når vi tager dette emne op, skal vi tackle I / O, der kører i lang tid. Indtil da - glad kodning!

© Copyright 2020 | mobilegn.com