Android goes Asynchronous

download Android goes Asynchronous

of 76

  • date post

    23-Jun-2015
  • Category

    Technology

  • view

    493
  • download

    0

Embed Size (px)

description

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.

Transcript of Android goes Asynchronous

  • 1. Arne Limburg | open knowledge GmbH@ArneLimburg @_openknowledge

2. Arne Limburg | open knowledge GmbH@ArneLimburg @_openknowledge 3. Agenda Einleitung Performance Asynchronitt 4. Prozesse & Threads Prozess Betriebssystemebene Mindestens einer pro Applikation Separat pro Komponente mglich Gruppierung mglich 5. manifest.xml 6. Prozesszustnde 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 mglich Blockieren des UI-Threads vermeiden 8. Agenda Einleitung Performance Asynchronitt 9. Agenda Einleitungim Android-Kern in einer AppAsynchronitt Performance 10. Agenda Performanceim Android-Kern in einer App Asynchronitt 11. Whats new in Jelly Bean? 12. Whats 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. Whats new in Kitkat? 24. Fokus auf RAM Weniger RAM fr Kernmodule Aggressiveres Aufrumen von Apps ActivityManager.isLowRamDevice() SurfaceFlinger Update auf OpenGL ES 2.0 25. Agenda Performanceim Android Kern in einer App Asynchronitt 26. Agenda Performanceim Android Kern in einer App Asynchronitt 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. LsungAsynchronitt 30. Lsung Niemals im UI-Thread Langlaufende Berechnungen Datei-Zugriff Datenbank-Zugriff (z.B. startManagingCursor) Netzwerkzugriff ... 31. Agenda Performanceim Android Kern in einer App Asynchronitt 32. Agenda Performanceim Android Kern in einer App Asynchronitt 33. Asynchronitt 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 callable = new Callable() { public Result call () { // calculate result } } Future 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 fr UI-Thread) Lsung 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? Lsung 1: Activity.runOnUiThread Lsung 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 Ausfhren 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? Lsung 1: Activity.runOnUiThread Lsung 2: Handler Lsung 3: AsyncTask 47. AsyncTask Bietet Callback-Funktionen in def. Threads doInBackground onProgressUpdate onPostExecute Parameter, Rckgabe-Wert, Progress-Info 48. AsyncTask public class MyTask extends AsyncTask { public R doInBackground(A args) { // running in background thread P progress = publishProgress(progress); } } 49. AsyncTask public class MyTask extends AsyncTask { 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? Lsung 1: Activity.runOnUiThread Lsung 2: Handler Lsung 3: AsyncTask Lsung 4: Loader 52. Loader Neu seit Android 3 (API Level 11) Ersatz fr 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? Lsung 1: Activity.runOnUiThread Lsung 2: Handler Lsung 3: AsyncTask Lsung 4: Loader Lsung 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? Lsung 1: Activity.runOnUiThread Lsung 2: Handler Lsung 3: AsyncTask Lsung 4: Loader Lsung 5: Services 60. Inter-Thread-Kommunikation Wie kommen asynchron geholte Daten in den UI-Thread? Lsung 1: Activity.runOnUiThread Lsung 2: Handler Lsung 3: AsyncTask Lsung 4: Loader Lsung 5: Services Lsung 6: BroadcastReceiver 61. BroadcastReceiver Eigene Android-Komponente mit separatem Lebenszyklus Empfnger fr 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 Fr Kommunikation innerhalb der App Verwendung LocalBroadcastManager.getInstance registerReceiver sendBroadcast 64. LocalBroadcastManager Nicht Teil der Android API Im Android Support Package Fr Kommunikation innerhalb der App Verwendung LocalBroadcastManager.getInstance registerReceiver sendBroadcast 65. Agenda Performance Asynchronitt 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 fr einfache Aufgaben 71. Fazit Always take the right guy for the job! Plain Threads AsyncTask meist besser AsyncTask fr 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 fr einfache Aufgaben Loader Neu aber gut fr den Job 73. Fazit Always take the right guy for the job! Plain Threads AsyncTask meist besser AsyncTask fr einfache Aufgaben Loader Neu aber gut fr 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 fr einfache Aufgaben Loader Neu aber gut fr den Job Services IntentService meist einfacher 75. Fazit Always take the right guy for the job! Plain Threads AsyncTask meist besser AsyncTask fr einfache Aufgaben Loader Neu aber gut fr den Job Services IntentService meist einfacher BroadcastReceiver Entkoppelt aber nicht asynchron 76. Q&A Vielen Dank fr Ihre Zeit. Kontakt: open knowledge GmbH Bismarckstr. 13 26122 Oldenburg arne.limburg@openknowledge.de @ArneLimburg @_openknowledge