android-perfomance und asynchronität

58
Arne Limburg | open knowledge GmbH Performance und Asynchronität @ArneLimburg @_openknowledg e

Upload: open-knowledge-gmbh

Post on 23-Jun-2015

358 views

Category:

Documents


0 download

DESCRIPTION

Speaker: Arne Limburg MobileTechCon 14.3.2013 Dank der Performanceverbesserungen, die Android Jelly Bean Out of the Box mitbringt, fühlen sich auch alte Apps auf Jelly Bean deutlich performanter an. Wodurch kommt diese Verbesserung zustande, und was kann der Entwickler tun, um das Benutzergefühl seiner Apps weiter zu verbessern und das auch in älteren Android-Versionen? Diese Session erklärt die Technologien, die hinter den Performanceoptimierungen von Jelly Bean stecken, und geht darüber hinaus auf die verschiedenen Patterns und Techniken ein, die Android bietet, um durch geschicktes Anwenden von Asynchronität die gefühlte Performance von Apps deutlich zu verbessern.

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