Arne Limburg | open knowledge GmbH

@ArneLimburg
@_openknowledge
Arne Limburg | open knowledge GmbH

@ArneLimburg
@_openknowledge
Agenda
Einleitung
Performance
Asynchronität
Prozesse & Threads
Prozess
• Betriebssystemebene
• Mindestens einer pro Applikation
• Separat pro Komponente möglich
• Gru...
manifest.xml
<manifest ...>
<activity ...
android:process=":private.process"
...
</activity>
<activity ...
android:process...
Prozesszustände
• Foreground
– Activity (active)
– Service
(bound, startForeground, onStart, ...)

• Visible (paused Activ...
Prozesse & Threads
Thread
• Applikationsebene
• Mindestens einer pro Applikation
(UI-Thread)
• Weitere möglich
Blockieren...
Agenda
Einleitung
Performance
Asynchronität
Agenda
Einleitung

im Android-Kern
in einer App

Asynchronität
Performance
Agenda
Performance

im Android-Kern
in einer App
Asynchronität
What‘s new in Jelly Bean?
What‘s new in Jelly Bean?
Performance-Gewinn durch „Project Butter“
Was ist das?
Project Butter
• VSync
• Triple Buffering
• Touch Responsiveness
Und was
bringt das?
Was ist VSync?

http://schnurpsel.de/neue-qualitaet-bei-kommentar-spam-oder-alter-hut-223/
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
What‘s new in Kitkat?
Fokus auf RAM
• Weniger RAM für Kernmodule
• Aggressiveres Aufräumen von Apps
• ActivityManager.isLowRamDevice()

• Surfac...
Agenda
Performance

im Android Kern
in einer App
Asynchronität
Agenda
Performance

im Android Kern
in einer App
Asynchronität
Performance einer App
Performance-Probleme
• Schlechte Architektur
• Datei-Zugriff
• Datenbank-Zugriff
• Netzwerkzugriff
•...
Tools zur Performance Analyse
•
•
•
•

Hierarchy Viewer
Traceview
dmtracedump
Systrace
Lösung

Asynchronität
Lösung
Niemals im UI-Thread
• Langlaufende Berechnungen
• Datei-Zugriff
• Datenbank-Zugriff
(z.B. startManagingCursor)
• N...
Agenda
Performance

im Android Kern
in einer App
Asynchronität
Agenda
Performance

im Android Kern
in einer App
Asynchronität
Asynchronität
Java-Bordmittel funktionieren auch in
Android!
• Thread
• ThreadPool
• Future
Thread
public void someMethod() {
Runnable runnable = new Runnable() {
public void run() {
// another thread
}
}
new Threa...
ThreadPool
private ExecutorService pool
= Executors.newFixedThreadPool(5);
public void someMethod() {
Runnable runnable = ...
Future
public void someMethod() {
Callable<Result> callable
= new Callable() {
public Result call () {
// calculate result...
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in
den UI-Thread?
CalledFromWrongThreadException
• Problem: ...
Activity.runOnUiThread
public void someMethod() {
Runnable runnable = new Runnable() {
public void run() {
// some busines...
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in
den UI-Thread?
• Lösung 1: Activity.runOnUiThread
• Lösun...
Handler
• Verschicken von Nachrichten über
Thread-Grenzen hinweg
• Bindung an den erzeugenden Thread
Im UI-Thread erzeuge...
Handler
public class MyHandler extends Handler {
public void handleMessage(Message message) {
… // running in handler thre...
Handler
Verschicken von Nachrichten
• sendMessage
• sendMessageAtTime
• sendMessageDelayed
• sendMessageAtFrontOfQueue
Handler
public void someMethod() {
Message message = handler.obtainMessage();
…
handler.sendMessage(message);
}
Handler
Ausführen von Aktionen
• post
• postAtTime
• postDelayed
• postAtFrontOfQueue
Handler
public void onCreate(Bundle saved) {
handler = new Handler();
}
public void someMethod() {
Runnable runnable = new...
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in
den UI-Thread?
• Lösung 1: Activity.runOnUiThread
• Lösun...
AsyncTask
Bietet
• Callback-Funktionen in def. Threads
– doInBackground
– onProgressUpdate
– onPostExecute

• Parameter, R...
AsyncTask
public class MyTask
extends AsyncTask<A, P, R> {
public R doInBackground(A… args) {
… // running in background t...
AsyncTask
public class MyTask
extends AsyncTask<A, P, R> {
…
public void onProgressUpdate(P… p) {
… // running in ui threa...
AsyncTask
Nachteile:
• Nur ein Parameter-Typ
• Anzahl Threads?
• Behandlung von Configuration-Changes
(z.B. Screen-Rotatio...
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in
den UI-Thread?
• Lösung 1: Activity.runOnUiThread
• Lösun...
Loader
• Neu seit Android 3 (API Level 11)
• Ersatz für startManagingCursor und
Cursor.requery()
• Behandlung von Configur...
Code Diving ...
Implementierung eines Loaders
• Ableiten von AsyncTaskLoader
• Implementierung von
loadInBackground()

• Optional: Übersch...
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in
den UI-Thread?
• Lösung 1: Activity.runOnUiThread
• Lösun...
Service
• Eigene Android-Komponente
mit separatem Lebenszyklus
• Lang-laufende Operationen
ohne UI-Interaktion
• Nicht per...
Service Lebenszyklus
IntentService
public class MyIntentService
extends IntentService {
…
public void onHandleIntent(Intent intent) {
…
}
}
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in
den UI-Thread?
• Lösung 1: Activity.runOnUiThread
• Lösun...
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in
den UI-Thread?
• Lösung 1: Activity.runOnUiThread
• Lösun...
BroadcastReceiver
• Eigene Android-Komponente
mit separatem Lebenszyklus
• Empfänger für systemweite Nachrichten
• Low-Bat...
Code Diving ...
LocalBroadcastManager
•
•
•
•

Nicht Teil der Android API
Im Android Support Package
Für Kommunikation innerhalb der App
V...
LocalBroadcastManager
•
•
•
•

Nicht Teil der Android API
Im Android Support Package
Für Kommunikation innerhalb der App
V...
Agenda
Performance
Asynchronität
Fazit
Fazit
Always take the right guy for the job!
Fazit
Always take the right guy for the job!
• Plain Threads
– Volle Kontrolle
– Kontextgebunden
– Manuelle UI-Updates
– H...
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
• AsyncTask
– Handling von UI-Update...
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
• AsyncTask  für einfache Aufgaben
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
• AsyncTask  für einfache Aufgaben
...
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
• AsyncTask  für einfache Aufgaben
...
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
• AsyncTask  für einfache Aufgaben
...
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
• AsyncTask  für einfache Aufgaben
...
Fazit
Always take the right guy for the job!
• Plain Threads  AsyncTask meist besser
• AsyncTask  für einfache Aufgaben
...
Q&A
Vielen Dank für Ihre Zeit.
Kontakt:
open knowledge GmbH
Bismarckstr. 13
26122 Oldenburg
arne.limburg@openknowledge.de
...
Upcoming SlideShare
Loading in...5
×

Android goes Asynchronous

521

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
521
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.

×