Android goes Asynchronous

594
-1

Published on

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
594
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Android goes Asynchronous

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

    Clipping is a handy way to collect important slides you want to go back to later.

×