Download - Android goes Asynchronous

Transcript
Page 1: Android goes Asynchronous

Arne Limburg | open knowledge GmbH

Android goes Asynchronous @ArneLimburg

@_openknowledge

Page 2: Android goes Asynchronous

Arne Limburg | open knowledge GmbH

Android goes Asynchronous @ArneLimburg

@_openknowledge

Page 3: Android goes Asynchronous

Agenda

Einleitung

Performance

Asynchronität

Page 4: Android goes Asynchronous

Prozesse & Threads

Prozess• Betriebssystemebene• Mindestens einer pro Applikation• Separat pro Komponente möglich• Gruppierung möglich

Page 5: Android goes Asynchronous

manifest.xml<manifest ...> <activity ... android:process=":private.process" ... </activity> <activity ... android:process="de.openknowledge..." ... </activity></manifest>

Page 6: Android goes Asynchronous

Prozesszustände

• Foreground– Activity (active)– Service

(bound, startForeground, onStart, ...)• Visible (paused Activity)• Service (via startService)• Background (stopped Activity)• Empty

Page 7: Android goes Asynchronous

Prozesse & Threads

Thread• Applikationsebene• Mindestens einer pro Applikation

(UI-Thread)• Weitere möglich

Blockieren des UI-Threads vermeiden

Page 8: Android goes Asynchronous

Agenda

Einleitung

Performance

Asynchronität

Page 9: Android goes Asynchronous

AsynchronitätPerformance

Agenda

Einleitung

im Android-Kern

in einer App

Page 10: Android goes Asynchronous

Agenda

Performance

Asynchronität

im Android-Kern

in einer App

Page 11: Android goes Asynchronous

What‘s new in Jelly Bean?

Page 12: Android goes Asynchronous

What‘s new in Jelly Bean?

Performance-Gewinn durch „Project Butter“

Page 13: Android goes Asynchronous

Was ist das?

Page 14: Android goes Asynchronous

Project Butter

• VSync• Triple Buffering• Touch Responsiveness

Page 15: Android goes Asynchronous

Und was bringt das?

Page 16: Android goes Asynchronous

Was ist VSync?

http://schnurpsel.de/neue-qualitaet-bei-kommentar-spam-oder-alter-hut-223/

Page 17: Android goes Asynchronous

Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012

Page 18: Android goes Asynchronous

Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012

Page 19: Android goes Asynchronous

Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012

Page 20: Android goes Asynchronous

Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012

Page 21: Android goes Asynchronous

Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012

Page 22: Android goes Asynchronous

Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012

Page 23: Android goes Asynchronous

What‘s new in Kitkat?

Page 24: Android goes Asynchronous

Fokus auf RAM

• Weniger RAM für Kernmodule• Aggressiveres Aufräumen von Apps

• ActivityManager.isLowRamDevice()

• SurfaceFlinger Update auf OpenGL ES 2.0

Page 25: Android goes Asynchronous

Agenda

Performance

Asynchronität

im Android Kern

in einer App

Page 26: Android goes Asynchronous

Agenda

Performance

Asynchronität

im Android Kern

in einer App

Page 27: Android goes Asynchronous

Performance einer App

Performance-Probleme• Schlechte Architektur• Datei-Zugriff• Datenbank-Zugriff• Netzwerkzugriff• ...• Selten schlechter Java-Code!

Page 28: Android goes Asynchronous

Tools zur Performance Analyse

• Hierarchy Viewer• Traceview• dmtracedump• Systrace

Page 29: Android goes Asynchronous

Lösung

Asynchronität

Page 30: Android goes Asynchronous

Lösung

Niemals im UI-Thread• Langlaufende Berechnungen• Datei-Zugriff• Datenbank-Zugriff

(z.B. startManagingCursor)• Netzwerkzugriff• ...

Page 31: Android goes Asynchronous

Agenda

Performance

Asynchronität

im Android Kern

in einer App

Page 32: Android goes Asynchronous

Agenda

Performance

Asynchronität

im Android Kern

in einer App

Page 33: Android goes Asynchronous

Asynchronität

Java-Bordmittel funktionieren auch in Android!

• Thread• ThreadPool• Future

Page 34: Android goes Asynchronous

Thread

public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } new Thread(runnable).start(); }

Page 35: Android goes Asynchronous

ThreadPool private ExecutorService pool = Executors.newFixedThreadPool(5);

public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } pool.execute(runnable); }

Page 36: Android goes Asynchronous

Future public void someMethod() { Callable<Result> callable = new Callable() { public Result call () { // calculate result } } Future<Result> future = pool.submit(callable); Result result = future.get(); }

Page 37: Android goes Asynchronous

Inter-Thread-Kommunikation

Wie kommen asynchron geholte Daten in den UI-Thread?

CalledFromWrongThreadException• Problem: Future blockiert

(nicht geeignet für UI-Thread)• Lösung 1: Activity.runOnUiThread

Page 38: Android goes Asynchronous

Activity.runOnUiThread

public void someMethod() { Runnable runnable = new Runnable() { public void run() { // some business logic runOnUiThread(new Runnable() {…}); } } pool.execute(runnable); }

Page 39: Android goes Asynchronous

Inter-Thread-Kommunikation

Wie kommen asynchron geholte Daten in den UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler

Page 40: Android goes Asynchronous

Handler

• Verschicken von Nachrichten über Thread-Grenzen hinweg

• Bindung an den erzeugenden ThreadIm UI-Thread erzeugenVon anderen Threads „Nachrichten“ an den

UI-Thread schicken

Page 41: Android goes Asynchronous

Handlerpublic class MyHandler extends Handler { public void handleMessage(Message message) { … // running in handler thread } …}

Page 42: Android goes Asynchronous

Handler

Verschicken von Nachrichten• sendMessage• sendMessageAtTime• sendMessageDelayed• sendMessageAtFrontOfQueue

Page 43: Android goes Asynchronous

Handler

public void someMethod() { Message message = handler.obtainMessage(); … handler.sendMessage(message);}

Page 44: Android goes Asynchronous

Handler

Ausführen von Aktionen• post• postAtTime• postDelayed• postAtFrontOfQueue

Page 45: Android goes Asynchronous

Handler public void onCreate(Bundle saved) { handler = new Handler(); }

public void someMethod() { Runnable runnable = new Runnable() { public void run() { handler.post(new Runnable() {…}); } } pool.execute(runnable);

Page 46: Android goes Asynchronous

Inter-Thread-Kommunikation

Wie kommen asynchron geholte Daten in den UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask

Page 47: Android goes Asynchronous

AsyncTask

Bietet• Callback-Funktionen in def. Threads

– doInBackground– onProgressUpdate– onPostExecute

• Parameter, Rückgabe-Wert, Progress-Info

Page 48: Android goes Asynchronous

AsyncTaskpublic class MyTask extends AsyncTask<A, P, R> { public R doInBackground(A… args) { … // running in background thread P progress = … publishProgress(progress); } …}

Page 49: Android goes Asynchronous

AsyncTaskpublic class MyTask extends AsyncTask<A, P, R> { … public void onProgressUpdate(P… p) { … // running in ui thread }

public void onPostExecute(R… result) { … // running in ui thread }}

Page 50: Android goes Asynchronous

AsyncTask

Nachteile:• Nur ein Parameter-Typ• Anzahl Threads?• Behandlung von Configuration-Changes

(z.B. Screen-Rotation)– onRetainNonConfigurationInstance– getLastNonConfigurationInstance– Mit Fragments: setRetainInstance

Page 51: Android goes Asynchronous

Inter-Thread-Kommunikation

Wie kommen asynchron geholte Daten in den UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader

Page 52: Android goes Asynchronous

Loader

• Neu seit Android 3 (API Level 11) • Ersatz für startManagingCursor und Cursor.requery()

• Behandlung von Configuration-Changes LoaderManager.initLoader

• Requery über restartLoader• Kommunikation über LoaderCallbacks

Page 53: Android goes Asynchronous

Code Diving ...

Page 54: Android goes Asynchronous

Implementierung eines Loaders

• Ableiten von AsyncTaskLoader• Implementierung von loadInBackground()

• Optional: Überschreiben von– onCanceled– onReset

Page 55: Android goes Asynchronous

Inter-Thread-Kommunikation

Wie kommen asynchron geholte Daten in den UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader• Lösung 5: Services?

Page 56: Android goes Asynchronous

Service

• Eigene Android-Komponente mit separatem Lebenszyklus

• Lang-laufende Operationen ohne UI-Interaktion

• Nicht per se asynchron

Page 57: Android goes Asynchronous

Service Lebenszyklus

Page 58: Android goes Asynchronous

IntentService

public class MyIntentService extends IntentService { … public void onHandleIntent(Intent intent) { … }}

Page 59: Android goes Asynchronous

Inter-Thread-Kommunikation

Wie kommen asynchron geholte Daten in den UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader• Lösung 5: Services

Page 60: Android goes Asynchronous

Inter-Thread-Kommunikation

Wie kommen asynchron geholte Daten in den UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader• Lösung 5: Services• Lösung 6: BroadcastReceiver

Page 61: Android goes Asynchronous

BroadcastReceiver

• Eigene Android-Komponente mit separatem Lebenszyklus

• Empfänger für systemweite Nachrichten• Low-Battery, Screen-Off, SMS-Received, ...• ohne eigene UI, Status Bar Notifications• Aufruf via sendBroadcast(Intent)

Page 62: Android goes Asynchronous

Code Diving ...

Page 63: Android goes Asynchronous

LocalBroadcastManager

• Nicht Teil der Android API• Im Android Support Package• Für Kommunikation innerhalb der App • Verwendung

– LocalBroadcastManager.getInstance– registerReceiver– sendBroadcast

Page 64: Android goes Asynchronous

LocalBroadcastManager

• Nicht Teil der Android API• Im Android Support Package• Für Kommunikation innerhalb der App • Verwendung

– LocalBroadcastManager.getInstance– registerReceiver– sendBroadcast

Page 65: Android goes Asynchronous

Agenda

Performance

Asynchronität

Fazit

Page 66: Android goes Asynchronous

FazitAlways take the right guy for the job!

Page 67: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads

– Volle Kontrolle– Kontextgebunden– Manuelle UI-Updates– Hohes Fehlerpotential

Page 68: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser

Page 69: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser• AsyncTask

– Handling von UI-Updates– Einfache Implementierung– Callback-API– Kontextgebunden– Achtung: Anzahl Threads beachten!

Page 70: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser• AsyncTask für einfache Aufgaben

Page 71: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser• AsyncTask für einfache Aufgaben• Loader

– Eigener Kontext– Vorgegebener Lifecycle– Wenig Dokumentation– API Level 11 (4)

Page 72: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser• AsyncTask für einfache Aufgaben• Loader Neu aber gut für den Job

Page 73: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser• AsyncTask für einfache Aufgaben• Loader Neu aber gut für den Job• Services

– Eigener Kontext– Eigenes Threading– Eigene Synchronisation– Komplizierte Callbacks

Page 74: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser• AsyncTask für einfache Aufgaben• Loader Neu aber gut für den Job• Services IntentService meist einfacher

Page 75: Android goes Asynchronous

FazitAlways take the right guy for the job!• Plain Threads AsyncTask meist besser• AsyncTask für einfache Aufgaben• Loader Neu aber gut für den Job• Services IntentService meist einfacher• BroadcastReceiver

Entkoppelt aber nicht asynchron

Page 76: Android goes Asynchronous

Vielen Dank für Ihre Zeit.

Kontakt:

open knowledge GmbHBismarckstr. 1326122 Oldenburg

[email protected]

@ArneLimburg @_openknowledge

Q&A