"application not responding" - asynchronität in android

64
Arne Limburg | open knowledge GmbH @ArneLimburg @_openknowledge

Upload: open-knowledge-gmbh

Post on 23-Jun-2015

329 views

Category:

Technology


0 download

DESCRIPTION

Speaker: Arne Limburg MobileTechCon 2013 Berlin Eine Anwendung, die sich mit einer ANR-Meldung verabschiedet, ist der Worst Case. Auch wenn Android einige Konzepte zum Thema Asynchronität bietet, steckt hier der Teufel im Detail. Diese Session stellt die existierenden Konzepte vor, diskutiert die jeweiligen Anwendungsfälle, erläutert Pitfalls und geht auf den Umgang mit ihnen ein.

TRANSCRIPT

Page 1: "Application not responding" - Asynchronität in Android

Arne Limburg | open knowledge GmbH

@ArneLimburg @_openknowledge

Page 2: "Application not responding" - Asynchronität in Android

Arne Limburg | open knowledge GmbH

@ArneLimburg @_openknowledge

Page 3: "Application not responding" - Asynchronität in Android

Agenda

Einleitung

Performance

Asynchronität

Page 4: "Application not responding" - Asynchronität in Android

Prozesse & Threads

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

Page 5: "Application not responding" - Asynchronität in Android

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

Page 6: "Application not responding" - Asynchronität in Android

Prozesszustände

•  Foreground – Activity (active) – Service

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

Page 7: "Application not responding" - Asynchronität in Android

Prozesse & Threads

Thread •  Applikationsebene •  Mindestens einer pro Applikation

(UI-Thread) •  Weitere möglich àBlockieren des UI-Threads vermeiden

Page 8: "Application not responding" - Asynchronität in Android

Agenda

Einleitung

Performance

Asynchronität

Page 9: "Application not responding" - Asynchronität in Android

Agenda

Einleitung

in Jelly Bean

in einer App

Asynchronität Performance

Page 10: "Application not responding" - Asynchronität in Android

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 11: "Application not responding" - Asynchronität in Android

What‘s new in Jelly Bean?

Page 12: "Application not responding" - Asynchronität in Android

What‘s new in Jelly Bean?

Performance-Gewinn durch „Project Butter“

Page 13: "Application not responding" - Asynchronität in Android

Was ist das?

Page 14: "Application not responding" - Asynchronität in Android

Project Butter

•  VSync •  Triple Buffering •  Touch Responsiveness

Page 15: "Application not responding" - Asynchronität in Android

Und was bringt das?

Page 16: "Application not responding" - Asynchronität in Android

Was ist VSync?

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

Page 17: "Application not responding" - Asynchronität in Android

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

Page 18: "Application not responding" - Asynchronität in Android

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

Page 19: "Application not responding" - Asynchronität in Android

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

Page 20: "Application not responding" - Asynchronität in Android

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

Page 21: "Application not responding" - Asynchronität in Android

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

Page 22: "Application not responding" - Asynchronität in Android

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

Page 23: "Application not responding" - Asynchronität in Android

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 24: "Application not responding" - Asynchronität in Android

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 25: "Application not responding" - Asynchronität in Android

Performance einer App

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

Page 26: "Application not responding" - Asynchronität in Android

Lösung

Asynchronität

Page 27: "Application not responding" - Asynchronität in Android

Lösung

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

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

Page 28: "Application not responding" - Asynchronität in Android

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 29: "Application not responding" - Asynchronität in Android

Agenda

Performance

Asynchronität

in Jelly Bean

in einer App

Page 30: "Application not responding" - Asynchronität in Android

Asynchronität

Java-Bordmittel funktionieren auch in Android!

•  Thread •  ThreadPool •  Future

Page 31: "Application not responding" - Asynchronität in Android

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

Page 32: "Application not responding" - Asynchronität in Android

ThreadPool private ExecutorService pool = Executors.newFixedThreadPool(5); public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } pool.execute(runnable); }

Page 33: "Application not responding" - Asynchronität in Android

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 34: "Application not responding" - Asynchronität in Android

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 35: "Application not responding" - Asynchronität in Android

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

Page 36: "Application not responding" - Asynchronität in Android

Inter-Thread-Kommunikation

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

Page 37: "Application not responding" - Asynchronität in Android

Handler

•  Verschicken von Nachrichten über Thread-Grenzen hinweg

•  Bindung an den erzeugenden Thread Ø Im UI-Thread erzeugen Ø Von anderen Threads „Nachrichten“ an

den UI-Thread schicken

Page 38: "Application not responding" - Asynchronität in Android

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

Page 39: "Application not responding" - Asynchronität in Android

Handler

Verschicken von Nachrichten • sendMessage • sendMessageAtTime • sendMessageDelayed • sendMessageAtFrontOfQueue

Page 40: "Application not responding" - Asynchronität in Android

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

Page 41: "Application not responding" - Asynchronität in Android

Handler

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

Page 42: "Application not responding" - Asynchronität in Android

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 43: "Application not responding" - Asynchronität in Android

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 44: "Application not responding" - Asynchronität in Android

AsyncTask

Bietet •  Callback-Funktionen in def. Threads

– doInBackground – onProgressUpdate – onPostExecute

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

Page 45: "Application not responding" - Asynchronität in Android

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

Page 46: "Application not responding" - Asynchronität in Android

AsyncTask public 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 47: "Application not responding" - Asynchronität in Android

AsyncTask

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

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

Page 48: "Application not responding" - Asynchronität in Android

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 49: "Application not responding" - Asynchronität in Android

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 50: "Application not responding" - Asynchronität in Android

Code Diving ...

Page 51: "Application not responding" - Asynchronität in Android

Implementierung eines Loaders

•  Ableiten von AsyncTaskLoader •  Implementierung von loadInBackground()

•  Optional: Überschreiben von – onCanceled – onReset

Page 52: "Application not responding" - Asynchronität in Android

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 53: "Application not responding" - Asynchronität in Android

Service

•  Eigene Android-Komponente mit separatem Lebenszyklus

•  Lang-laufende Operationen ohne UI-Interaktion

•  Nicht per se asynchron

Page 54: "Application not responding" - Asynchronität in Android

Service Lebenszyklus

Page 55: "Application not responding" - Asynchronität in Android

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

Page 56: "Application not responding" - Asynchronität in Android

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 57: "Application not responding" - Asynchronität in Android

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 58: "Application not responding" - Asynchronität in Android

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 59: "Application not responding" - Asynchronität in Android

Code Diving ...

Page 60: "Application not responding" - Asynchronität in Android

LocalBroadcastManager

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

– LocalBroadcastManager.getInstance – registerReceiver – sendBroadcast

Page 61: "Application not responding" - Asynchronität in Android

LocalBroadcastManager

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

– LocalBroadcastManager.getInstance – registerReceiver – sendBroadcast

Page 62: "Application not responding" - Asynchronität in Android

Agenda

Performance

Asynchronität

Fazit

Page 63: "Application not responding" - Asynchronität in Android

Fazit Always 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 64: "Application not responding" - Asynchronität in Android

Vielen Dank für Ihre Zeit. Kontakt: open knowledge GmbH Bismarckstr. 13 26122 Oldenburg [email protected] @ArneLimburg @_openknowledge

Q&A