Android-Perfomance und Asynchronität
Upcoming SlideShare
Loading in...5
×
 

Android-Perfomance und Asynchronität

on

  • 597 views

Speaker: Arne Limburg ...

Speaker: Arne Limburg
MobileTechCon
14.3.2013

Dank der Performanceverbesserungen, die Android Jelly Bean Out of the Box mitbringt, fühlen sich auch alte Apps auf Jelly Bean deutlich performanter an. Wodurch kommt diese Verbesserung zustande, und was kann der Entwickler tun, um das Benutzergefühl seiner Apps weiter zu verbessern und das auch in älteren Android-Versionen? Diese Session erklärt die Technologien, die hinter den Performanceoptimierungen von Jelly Bean stecken, und geht darüber hinaus auf die verschiedenen Patterns und Techniken ein, die Android bietet, um durch geschicktes Anwenden von Asynchronität die gefühlte Performance von Apps deutlich zu verbessern.

Statistics

Views

Total Views
597
Views on SlideShare
590
Embed Views
7

Actions

Likes
0
Downloads
5
Comments
0

1 Embed 7

http://www.openknowledge.de 7

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Android-Perfomance und Asynchronität Android-Perfomance und Asynchronität Presentation Transcript

  • Arne Limburg | open knowledge GmbH @ArneLimburg @_openknowledge
  • Agenda Performance Asynchronität
  • Agenda Performancein Jelly Bean Asynchronitätin einer App View slide
  • Agenda Performancein Jelly Beanin einer App Asynchronität View slide
  • 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 wasbringt 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
  • Agenda Performancein Jelly Beanin einer App Asynchronität
  • Agenda Performancein Jelly Beanin einer App Asynchronität
  • Performance einer AppPerformance-Probleme• Schlechte Architektur• Datei-Zugriff• Datenbank-Zugriff• Netzwerkzugriff• ...• Selten schlechter Java-Code!
  • LösungAsynchronität
  • LösungNiemals im UI-Thread• Langlaufende Berechnungen• Datei-Zugriff• Datenbank-Zugriff (z.B. startManagingCursor)• Netzwerkzugriff• ...
  • Agenda Performancein Jelly Beanin einer App Asynchronität
  • Agenda Performancein Jelly Beanin einer App Asynchronität
  • Asynchronität Java-Bordmittel funktionieren auch in Android!• Thread• ThreadPool• Future
  • Threadpublic void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } new Thread(runnable).start();}
  • ThreadPoolprivate ExecutorService pool = Executors.newFixedThreadPool(5);public void someMethod() { Runnable runnable = new Runnable() { public void run() { // another thread } } pool.execute(runnable);}
  • Futurepublic void someMethod() { Callable<Result> callable = new Callable() { public Result call () { // calculate result } } Future<Result> future = pool.submit(callable); Result result = future.get();}
  • Inter-Thread-KommunikationWie kommen asynchron geholte Daten inden UI-Thread?CalledFromWrongThreadException• Problem: Future blockiert (nicht geeignet für UI-Thread)• Lösung 1: Activity.runOnUiThread
  • Activity.runOnUiThreadpublic void someMethod() { Runnable runnable = new Runnable() { public void run() { // some business logic runOnUiThread(new Runnable() {…}); } } pool.execute(runnable);}
  • Inter-Thread-KommunikationWie kommen asynchron geholte Daten inden UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler
  • 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
  • Handlerpublic class MyHandler extends Handler { public void handleMessage(Message message) { … // running in handler thread } …}
  • HandlerVerschicken von Nachrichten• sendMessage• sendMessageAtTime• sendMessageDelayed• sendMessageAtFrontOfQueue
  • Handlerpublic void someMethod() { Message message = handler.obtainMessage(); … handler.sendMessage(message);}
  • HandlerAusführen von Aktionen• post• postAtTime• postDelayed• postAtFrontOfQueue
  • Handlerpublic void onCreate(Bundle saved) { handler = new Handler();}public void someMethod() { Runnable runnable = new Runnable() { public void run() { handler.post(new Runnable() {…}); } } pool.execute(runnable);
  • Inter-Thread-KommunikationWie kommen asynchron geholte Daten inden UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask
  • AsyncTaskBietet• Callback-Funktionen in def. Threads – doInBackground – onProgressUpdate – onPostExecute• Parameter, Rückgabe-Wert, Progress-Info
  • AsyncTaskpublic class MyTask extends AsyncTask<A, P, R> { public R doInBackground(A… args) { … // running in background thread P progress = … publishProgress(progress); } …}
  • 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 }}
  • AsyncTaskNachteile:• Nur ein Parameter-Typ• Behandlung von Configuration-Changes (z.B. Screen-Rotation) – onRetainNonConfigurationInstance – getLastNonConfigurationInstance – Mit Fragments: setRetainInstance
  • Inter-Thread-KommunikationWie kommen asynchron geholte Daten inden UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader
  • 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
  • Code Diving ...
  • Implementierung eines Loaders• Ableiten von AsyncTaskLoader• Implementierung von loadInBackground()• Optional: Überschreiben von – onCanceled – onReset
  • Inter-Thread-KommunikationWie kommen asynchron geholte Daten inden UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader• Lösung 5: Services?
  • Service• Eigene Android-Komponente mit separatem Lebenszyklus• Lang-laufende Operationen ohne UI-Interaktion• Nicht per se asynchron
  • Service Lebenszyklus
  • IntentServicepublic class MyIntentService extends IntentService { … public void onHandleIntent(Intent intent) { … }}
  • Inter-Thread-KommunikationWie kommen asynchron geholte Daten inden UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader• Lösung 5: Services
  • Inter-Thread-KommunikationWie kommen asynchron geholte Daten inden UI-Thread?• Lösung 1: Activity.runOnUiThread• Lösung 2: Handler• Lösung 3: AsyncTask• Lösung 4: Loader• Lösung 5: BroadcastReceiver
  • 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)
  • Code Diving ...
  • LocalBroadcastManager• Nicht Teil der Android API• Im Android Support Package• Für Kommunikation innerhalb der App• Verwendung – LocalBroadcastManager.getInstance – registerReceiver – sendBroadcast
  • LocalBroadcastManager• Nicht Teil der Android API• Im Android Support Package• Für Kommunikation innerhalb der App• Verwendung – LocalBroadcastManager.getInstance – registerReceiver – sendBroadcast
  • Agenda Performance Asynchronität Fazit
  • 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
  • Q&AVielen Dank für Ihre Zeit.Kontakt:open knowledge GmbHBismarckstr. 1326122 Oldenburgarne.limburg@openknowledge.de @ArneLimburg @_openknowledge