Android-Programmering Våren 2016
Oversikt Ytelse vs responsivitet Strategier for og opprettholde responsiviteten Tråder Asynchronous Task
Ytelse vs responsivitet Forskjellen på ytelse og responsivitet Ytelse: Hvor raskt er det? Responsivitet: Hvor raskt føles det? I brukerorienterte applikasjoner er responsiviteten viktig
Android Oppbygning De fleste applikasjone følger samme oppbygning Instans av Application klassen En eller flere instanser av Activity klassen Flere instanser av View klasser Meny Alt dette kjører i en tråd (Main Thread) Activity, Views, menyer og event handlers
Android Responsivitet Må holde hovedtråden «åpen» for event handeling < 200ms Helst < 100ms Activity Manager og Windows Manager Rensponsivitet og ANR (Application Not Responding) errors Grense på 5 sekunder i hovedtråden
Strategier for og opprettholde responsiviteten Unngå blokkerende operasjoner i hovedtråden Bruke ekstra tråder Bruke servicer
Detektere potensielt blokkerende oppgaver Unngå blokkerende operasjoner i hovedtråden Ingen filsystemoperasjoner Ingen nettverksoperasjoner Vanskelig og vite hva andre bibliotek og API’er gjør Strictmode class kan hjelpe Detektere operasjoner Vanlig å bruke enableDefaults Bruk bare under utvikling
Tråder Ekstra tråder Bra til potensielt blokkerende oppgaver Nyttig til mindre oppgaver Fra 100ms til noen få sekunder Problematisk til oppgaver lenger enn noen få sekunder Kan bli drept
Opprette tråder Bruk Thread klassen til å lage nye tråder Lag en instans av Thread klassen Send inn en implementasjon av Runnable interfacet til Thread konstruktøren Kall Thread.Start De samme trådproblemene gjelder Unngå race conditions Unngå fellesbruk av verdier Unngå å lage mange små tråder ofte
Tråder og brukergrensesnittet Kun trygg oppdatering av brukergrensesnitt fra hovedtråden Helpemetoder Activity.runOnUiThread View.post
Prisen for dedikerte tråder Dedikerte tråder er ikke nødvendigvis beste valget for å forbedre responsiviteten Koster en del ressurser og lage/bryte ned en tråd Mye boiler-plate kode
Asynchronous tasks AsyncTask klassen Designet spesifikt for og opprettholde responsiviteten Deler opp arbeidet Hente informasjon fra brukergrensesnittet og hovedtråden: onPreExecute Arbeid i en tråd i bakgrunnen: doInBackground Oppdatere brukergrensesnittet i hovedtråden: publishProgress/onProgressUpdate Når arbeidet er ferdig, oppdater brukergrensesnittet: onPostExecute Kjører sekvensielt Bedre ressursbruk enn dedikerte tråder Kan bli drept
AsyncTask AsyncTask er en generisk klasse Spesifiserer parametere ved bruk av generiske argumenter til AcyncTask Tillater 3 typer parametere Parametertypen som blir akseptert av execute metoden Blir sendt internt til doInBackground Blir sendt inn som en liste med variabel lengde Parametertypen som sendes fra doInBackground til publishProgress Samme parameter blir sendt internt til onProgressUpdate Blir sendt inn som en liste med variabel lengde Return type fra doInBackground Blir sendt til onPostExecute som en enkelt parameter
Oppsumering Proritere brukergrensesnitt responsivitet Begrens event handler kode på hovedtråden til 100 ms Ikke utfør potensielt blokkerende operasjoner Bruk StrictMode klassen for å avdekke disse operasjonene Bruk AsyncTask til å frigjøre UI tråden Tåder og AsyncTask kan bli drept