Transcript
Page 1: Android-Perfomance und Asynchronität

Arne Limburg | open knowledge GmbH

Performance und Asynchronität @ArneLimburg

@_openknowledge

Page 2: Android-Perfomance und Asynchronität

Agenda

Performance

Asynchronität

Page 3: Android-Perfomance und Asynchronität

Agenda

Performance

in Jelly Bean

in einer App

Asynchronität

Page 4: Android-Perfomance und Asynchronität

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 5: Android-Perfomance und Asynchronität

What‘s new in Jelly Bean?

Page 6: Android-Perfomance und Asynchronität

What‘s new in Jelly Bean?

Performance-Gewinn durch „Project Butter“

Page 7: Android-Perfomance und Asynchronität

Was ist das?

Page 8: Android-Perfomance und Asynchronität

Project Butter

• VSync• Triple Buffering• Touch Responsiveness

Page 9: Android-Perfomance und Asynchronität

Und was bringt das?

Page 10: Android-Perfomance und Asynchronität

Was ist VSync?

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

Page 11: Android-Perfomance und Asynchronität

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

Page 12: Android-Perfomance und Asynchronität

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

Page 13: Android-Perfomance und Asynchronität

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

Page 14: Android-Perfomance und Asynchronität

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

Page 15: Android-Perfomance und Asynchronität

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

Page 16: Android-Perfomance und Asynchronität

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

Page 17: Android-Perfomance und Asynchronität

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 18: Android-Perfomance und Asynchronität

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 19: Android-Perfomance und Asynchronität

Performance einer App

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

Page 20: Android-Perfomance und Asynchronität

Lösung

Asynchronität

Page 21: Android-Perfomance und Asynchronität

Lösung

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

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

Page 22: Android-Perfomance und Asynchronität

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 23: Android-Perfomance und Asynchronität

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 24: Android-Perfomance und Asynchronität

Asynchronität

Java-Bordmittel funktionieren auch in Android!

• Thread• ThreadPool• Future

Page 25: Android-Perfomance und Asynchronität

Thread

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

Page 26: Android-Perfomance und Asynchronität

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

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

Page 27: Android-Perfomance und Asynchronität

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 28: Android-Perfomance und Asynchronität

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 29: Android-Perfomance und Asynchronität

Activity.runOnUiThread

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

Page 30: Android-Perfomance und Asynchronität

Inter-Thread-Kommunikation

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

Page 31: Android-Perfomance und Asynchronität

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 32: Android-Perfomance und Asynchronität

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

Page 33: Android-Perfomance und Asynchronität

Handler

Verschicken von Nachrichten• sendMessage• sendMessageAtTime• sendMessageDelayed• sendMessageAtFrontOfQueue

Page 34: Android-Perfomance und Asynchronität

Handler

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

Page 35: Android-Perfomance und Asynchronität

Handler

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

Page 36: Android-Perfomance und Asynchronität

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 37: Android-Perfomance und Asynchronität

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 38: Android-Perfomance und Asynchronität

AsyncTask

Bietet• Callback-Funktionen in def. Threads

– doInBackground– onProgressUpdate– onPostExecute

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

Page 39: Android-Perfomance und Asynchronität

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

Page 40: Android-Perfomance und Asynchronität

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 41: Android-Perfomance und Asynchronität

AsyncTask

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

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

Page 42: Android-Perfomance und Asynchronität

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 43: Android-Perfomance und Asynchronität

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 44: Android-Perfomance und Asynchronität

Code Diving ...

Page 45: Android-Perfomance und Asynchronität

Implementierung eines Loaders

• Ableiten von AsyncTaskLoader• Implementierung von loadInBackground()

• Optional: Überschreiben von– onCanceled– onReset

Page 46: Android-Perfomance und Asynchronität

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 47: Android-Perfomance und Asynchronität

Service

• Eigene Android-Komponente mit separatem Lebenszyklus

• Lang-laufende Operationen ohne UI-Interaktion

• Nicht per se asynchron

Page 48: Android-Perfomance und Asynchronität

Service Lebenszyklus

Page 49: Android-Perfomance und Asynchronität

IntentService

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

Page 50: Android-Perfomance und Asynchronität

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 51: Android-Perfomance und Asynchronität

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: BroadcastReceiver

Page 52: Android-Perfomance und Asynchronität

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 53: Android-Perfomance und Asynchronität

Code Diving ...

Page 54: Android-Perfomance und Asynchronität

LocalBroadcastManager

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

– LocalBroadcastManager.getInstance– registerReceiver– sendBroadcast

Page 55: Android-Perfomance und Asynchronität

LocalBroadcastManager

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

– LocalBroadcastManager.getInstance– registerReceiver– sendBroadcast

Page 56: Android-Perfomance und Asynchronität

Agenda

Performance

Asynchronität

Fazit

Page 57: Android-Perfomance und Asynchronität

FazitAlways take the right guy for the job!• BroadcastReceiver zur Entkopplung

– Mit LocalBroadcastManager für In-App• Service mit eigenem Lebenszyklus• Loader für kurze Hintergrundaufgaben• AsyncTask für Progress-Feedback• Handler zum Ausführen in anderem Thread

– runOnUiThread als Shortcut

Page 58: Android-Perfomance und Asynchronität

Vielen Dank für Ihre Zeit.

Kontakt:

open knowledge GmbHBismarckstr. 1326122 Oldenburg

[email protected]

@ArneLimburg @_openknowledge

Q&A


Top Related