Android-Perfomance und Asynchronität
-
Upload
open-knowledge-gmbh -
Category
Documents
-
view
355 -
download
0
description
Transcript of Android-Perfomance und Asynchronität
![Page 1: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/1.jpg)
Arne Limburg | open knowledge GmbH
Performance und Asynchronität @ArneLimburg
@_openknowledge
![Page 2: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/2.jpg)
Agenda
Performance
Asynchronität
![Page 3: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/3.jpg)
Agenda
Performance
in Jelly Bean
in einer App
Asynchronität
![Page 4: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/4.jpg)
Agenda
Performance
Asynchronität
in Jelly Bean
in einer App
![Page 5: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/5.jpg)
What‘s new in Jelly Bean?
![Page 6: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/6.jpg)
What‘s new in Jelly Bean?
Performance-Gewinn durch „Project Butter“
![Page 7: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/7.jpg)
Was ist das?
![Page 8: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/8.jpg)
Project Butter
• VSync• Triple Buffering• Touch Responsiveness
![Page 9: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/9.jpg)
Und was bringt das?
![Page 10: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/10.jpg)
Was ist VSync?
http://schnurpsel.de/neue-qualitaet-bei-kommentar-spam-oder-alter-hut-223/
![Page 11: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/11.jpg)
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
![Page 12: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/12.jpg)
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
![Page 13: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/13.jpg)
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
![Page 14: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/14.jpg)
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
![Page 15: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/15.jpg)
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
![Page 16: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/16.jpg)
Chet Haase, Romain Guy, Android UI Toolkit Engineers auf der Google I/O 2012
![Page 17: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/17.jpg)
Agenda
Performance
Asynchronität
in Jelly Bean
in einer App
![Page 18: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/18.jpg)
Agenda
Performance
Asynchronität
in Jelly Bean
in einer App
![Page 19: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/19.jpg)
Performance einer App
Performance-Probleme• Schlechte Architektur• Datei-Zugriff• Datenbank-Zugriff• Netzwerkzugriff• ...• Selten schlechter Java-Code!
![Page 20: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/20.jpg)
Lösung
Asynchronität
![Page 21: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/21.jpg)
Lösung
Niemals im UI-Thread• Langlaufende Berechnungen• Datei-Zugriff• Datenbank-Zugriff
(z.B. startManagingCursor)• Netzwerkzugriff• ...
![Page 22: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/22.jpg)
Agenda
Performance
Asynchronität
in Jelly Bean
in einer App
![Page 23: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/23.jpg)
Agenda
Performance
Asynchronität
in Jelly Bean
in einer App
![Page 24: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/24.jpg)
Asynchronität
Java-Bordmittel funktionieren auch in Android!
• Thread• ThreadPool• Future
![Page 25: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/25.jpg)
Thread
public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } new Thread(runnable).start(); }
![Page 26: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/26.jpg)
ThreadPool private ExecutorService pool = Executors.newFixedThreadPool(5);
public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } pool.execute(runnable); }
![Page 27: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/27.jpg)
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 28: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/28.jpg)
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 29: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/29.jpg)
Activity.runOnUiThread
public void someMethod() { Runnable runnable = new Runnable() { public void run() { // some business logic runOnUiThread(new Runnable() {…}); } } pool.execute(runnable); }
![Page 30: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/30.jpg)
Inter-Thread-Kommunikation
Wie kommen asynchron geholte Daten in den UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler
![Page 31: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/31.jpg)
Handler
• Verschicken von Nachrichten über Thread-Grenzen hinweg
• Bindung an den erzeugenden ThreadIm UI-Thread erzeugenVon anderen Threads „Nachrichten“ an den
UI-Thread schicken
![Page 32: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/32.jpg)
Handlerpublic class MyHandler extends Handler { public void handleMessage(Message message) { … // running in handler thread } …}
![Page 33: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/33.jpg)
Handler
Verschicken von Nachrichten• sendMessage• sendMessageAtTime• sendMessageDelayed• sendMessageAtFrontOfQueue
![Page 34: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/34.jpg)
Handler
public void someMethod() { Message message = handler.obtainMessage(); … handler.sendMessage(message);}
![Page 35: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/35.jpg)
Handler
Ausführen von Aktionen• post• postAtTime• postDelayed• postAtFrontOfQueue
![Page 36: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/36.jpg)
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 37: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/37.jpg)
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 38: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/38.jpg)
AsyncTask
Bietet• Callback-Funktionen in def. Threads
– doInBackground– onProgressUpdate– onPostExecute
• Parameter, Rückgabe-Wert, Progress-Info
![Page 39: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/39.jpg)
AsyncTaskpublic class MyTask extends AsyncTask<A, P, R> { public R doInBackground(A… args) { … // running in background thread P progress = … publishProgress(progress); } …}
![Page 40: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/40.jpg)
AsyncTaskpublic 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 41: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/41.jpg)
AsyncTask
Nachteile:• Nur ein Parameter-Typ• Behandlung von Configuration-Changes
(z.B. Screen-Rotation)– onRetainNonConfigurationInstance– getLastNonConfigurationInstance– Mit Fragments: setRetainInstance
![Page 42: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/42.jpg)
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 43: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/43.jpg)
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 44: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/44.jpg)
Code Diving ...
![Page 45: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/45.jpg)
Implementierung eines Loaders
• Ableiten von AsyncTaskLoader• Implementierung von loadInBackground()
• Optional: Überschreiben von– onCanceled– onReset
![Page 46: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/46.jpg)
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 47: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/47.jpg)
Service
• Eigene Android-Komponente mit separatem Lebenszyklus
• Lang-laufende Operationen ohne UI-Interaktion
• Nicht per se asynchron
![Page 48: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/48.jpg)
Service Lebenszyklus
![Page 49: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/49.jpg)
IntentService
public class MyIntentService extends IntentService { … public void onHandleIntent(Intent intent) { … }}
![Page 50: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/50.jpg)
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 51: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/51.jpg)
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 52: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/52.jpg)
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 53: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/53.jpg)
Code Diving ...
![Page 54: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/54.jpg)
LocalBroadcastManager
• Nicht Teil der Android API• Im Android Support Package• Für Kommunikation innerhalb der App • Verwendung
– LocalBroadcastManager.getInstance– registerReceiver– sendBroadcast
![Page 55: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/55.jpg)
LocalBroadcastManager
• Nicht Teil der Android API• Im Android Support Package• Für Kommunikation innerhalb der App • Verwendung
– LocalBroadcastManager.getInstance– registerReceiver– sendBroadcast
![Page 56: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/56.jpg)
Agenda
Performance
Asynchronität
Fazit
![Page 57: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/57.jpg)
FazitAlways 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 58: Android-Perfomance und Asynchronität](https://reader035.fdocuments.us/reader035/viewer/2022062313/5588f606d8b42abd418b457f/html5/thumbnails/58.jpg)
Vielen Dank für Ihre Zeit.
Kontakt:
open knowledge GmbHBismarckstr. 1326122 Oldenburg
@ArneLimburg @_openknowledge
Q&A