Your SlideShare is downloading. ×

Android goes Asynchronous

427
views

Published on

Speaker: Arne Limburg …

Speaker: Arne Limburg
7. November 2013 | W-JAX München

Eine Anwendung, die sich mit einer "Application not Responding"-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.

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
427
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Arne Limburg | open knowledge GmbH @ArneLimburg @_openknowledge
  • 2. Arne Limburg | open knowledge GmbH @ArneLimburg @_openknowledge
  • 3. Agenda Einleitung Performance Asynchronität
  • 4. Prozesse & Threads Prozess • Betriebssystemebene • Mindestens einer pro Applikation • Separat pro Komponente möglich • Gruppierung möglich
  • 5. manifest.xml <manifest ...> <activity ... android:process=":private.process" ... </activity> <activity ... android:process="de.openknowledge..." ... </activity> </manifest>
  • 6. Prozesszustände • Foreground – Activity (active) – Service (bound, startForeground, onStart, ...) • Visible (paused Activity) • Service (via startService) • Background (stopped Activity) • Empty
  • 7. Prozesse & Threads Thread • Applikationsebene • Mindestens einer pro Applikation (UI-Thread) • Weitere möglich Blockieren des UI-Threads vermeiden
  • 8. Agenda Einleitung Performance Asynchronität
  • 9. Agenda Einleitung im Android-Kern in einer App Asynchronität Performance
  • 10. Agenda Performance im Android-Kern in einer App Asynchronität
  • 11. What‘s new in Jelly Bean?
  • 12. What‘s new in Jelly Bean? Performance-Gewinn durch „Project Butter“
  • 13. Was ist das?
  • 14. Project Butter • VSync • Triple Buffering • Touch Responsiveness
  • 15. Und was bringt das?
  • 16. Was ist VSync? http://schnurpsel.de/neue-qualitaet-bei-kommentar-spam-oder-alter-hut-223/
  • 17. Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
  • 18. Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
  • 19. Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
  • 20. Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
  • 21. Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
  • 22. Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
  • 23. What‘s new in Kitkat?
  • 24. Fokus auf RAM • Weniger RAM für Kernmodule • Aggressiveres Aufräumen von Apps • ActivityManager.isLowRamDevice() • SurfaceFlinger Update auf OpenGL ES 2.0
  • 25. Agenda Performance im Android Kern in einer App Asynchronität
  • 26. Agenda Performance im Android Kern in einer App Asynchronität
  • 27. Performance einer App Performance-Probleme • Schlechte Architektur • Datei-Zugriff • Datenbank-Zugriff • Netzwerkzugriff • ... • Selten schlechter Java-Code!
  • 28. Tools zur Performance Analyse • • • • Hierarchy Viewer Traceview dmtracedump Systrace
  • 29. Lösung Asynchronität
  • 30. Lösung Niemals im UI-Thread • Langlaufende Berechnungen • Datei-Zugriff • Datenbank-Zugriff (z.B. startManagingCursor) • Netzwerkzugriff • ...
  • 31. Agenda Performance im Android Kern in einer App Asynchronität
  • 32. Agenda Performance im Android Kern in einer App Asynchronität
  • 33. Asynchronität Java-Bordmittel funktionieren auch in Android! • Thread • ThreadPool • Future
  • 34. Thread public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } new Thread(runnable).start(); }
  • 35. ThreadPool private ExecutorService pool = Executors.newFixedThreadPool(5); public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } pool.execute(runnable); }
  • 36. Future public void someMethod() { Callable<Result> callable = new Callable() { public Result call () { // calculate result } } Future<Result> future = pool.submit(callable); Result result = future.get(); }
  • 37. 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
  • 38. Activity.runOnUiThread public void someMethod() { Runnable runnable = new Runnable() { public void run() { // some business logic runOnUiThread(new Runnable() {…}); } } pool.execute(runnable); }
  • 39. Inter-Thread-Kommunikation Wie kommen asynchron geholte Daten in den UI-Thread? • Lösung 1: Activity.runOnUiThread • Lösung 2: Handler
  • 40. 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
  • 41. Handler public class MyHandler extends Handler { public void handleMessage(Message message) { … // running in handler thread } … }
  • 42. Handler Verschicken von Nachrichten • sendMessage • sendMessageAtTime • sendMessageDelayed • sendMessageAtFrontOfQueue
  • 43. Handler public void someMethod() { Message message = handler.obtainMessage(); … handler.sendMessage(message); }
  • 44. Handler Ausführen von Aktionen • post • postAtTime • postDelayed • postAtFrontOfQueue
  • 45. 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);
  • 46. 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
  • 47. AsyncTask Bietet • Callback-Funktionen in def. Threads – doInBackground – onProgressUpdate – onPostExecute • Parameter, Rückgabe-Wert, Progress-Info
  • 48. AsyncTask public class MyTask extends AsyncTask<A, P, R> { public R doInBackground(A… args) { … // running in background thread P progress = … publishProgress(progress); } … }
  • 49. 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 } }
  • 50. AsyncTask Nachteile: • Nur ein Parameter-Typ • Anzahl Threads? • Behandlung von Configuration-Changes (z.B. Screen-Rotation) – onRetainNonConfigurationInstance – getLastNonConfigurationInstance – Mit Fragments: setRetainInstance
  • 51. 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
  • 52. 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
  • 53. Code Diving ...
  • 54. Implementierung eines Loaders • Ableiten von AsyncTaskLoader • Implementierung von loadInBackground() • Optional: Überschreiben von – onCanceled – onReset
  • 55. 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?
  • 56. Service • Eigene Android-Komponente mit separatem Lebenszyklus • Lang-laufende Operationen ohne UI-Interaktion • Nicht per se asynchron
  • 57. Service Lebenszyklus
  • 58. IntentService public class MyIntentService extends IntentService { … public void onHandleIntent(Intent intent) { … } }
  • 59. 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
  • 60. 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
  • 61. 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)
  • 62. Code Diving ...
  • 63. LocalBroadcastManager • • • • Nicht Teil der Android API Im Android Support Package Für Kommunikation innerhalb der App Verwendung – LocalBroadcastManager.getInstance – registerReceiver – sendBroadcast
  • 64. LocalBroadcastManager • • • • Nicht Teil der Android API Im Android Support Package Für Kommunikation innerhalb der App Verwendung – LocalBroadcastManager.getInstance – registerReceiver – sendBroadcast
  • 65. Agenda Performance Asynchronität Fazit
  • 66. Fazit Always take the right guy for the job!
  • 67. Fazit Always take the right guy for the job! • Plain Threads – Volle Kontrolle – Kontextgebunden – Manuelle UI-Updates – Hohes Fehlerpotential
  • 68. Fazit Always take the right guy for the job! • Plain Threads  AsyncTask meist besser
  • 69. Fazit Always 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!
  • 70. Fazit Always take the right guy for the job! • Plain Threads  AsyncTask meist besser • AsyncTask  für einfache Aufgaben
  • 71. Fazit Always 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)
  • 72. Fazit Always 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
  • 73. Fazit Always 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
  • 74. Fazit Always 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
  • 75. Fazit Always 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
  • 76. Q&A Vielen Dank für Ihre Zeit. Kontakt: open knowledge GmbH Bismarckstr. 13 26122 Oldenburg arne.limburg@openknowledge.de @ArneLimburg @_openknowledge