Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

18
Współbieżność w Androidzie Zrównoleglanie zadań w Javie na platformie Android Jacek Laskowski http://www.JacekLaskowski.pl wersja 1.0, 22.09.2012 [email protected]

description

Prezentacja jest podsumowaniem dotychczasowych doświadczeń prelegenta w rozpoznaniu tematu zrównoleglania zadań na platformie Android. Zwykło się traktować programowanie wielowątkowe jako tzw. ”zło konieczne” i nawet w sytuacjach zastosowania omija się je szerokim łukiem ze względu na brak wiedzy i doświadczenia. Prezentacja ma w zamyśle uzupełnić braki i być swoistym katalizatorem dalszych studiów w temacie we własnym zakresie. Więcej na http://2012.mobilization.pl/speakers/#JacekLaskowski

Transcript of Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

Page 1: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

Współbieżność w Androidzie

Zrównoleglanie zadań w Javie na platformie Android

Jacek Laskowski

http://www.JacekLaskowski.pl

wersja 1.0, 22.09.2012

[email protected]

Page 2: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

O prelegencie - Jacek Laskowski• Entuzjasta Java EE, OSGi, SCA oraz programowania funkcyjnego

(Clojure, F#, Scala)

• Założyciel i lider Warszawa JUG

• Organizator konferencji Javarsovia, Confitura, warsjawa

• Członek zespołu NetBeans DreamTeam

• Blogger na http://JacekLaskowski.pl

• Blogger na http://blog.japila.pl

• @jaceklaskowski na twitterze

• Członek zespołów Apache Geronimo i Apache OpenEJB

• IBMer w World-wide WebSphere Competitive Migration Team

http://JacekLaskowski.pl

Page 3: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

http://JacekLaskowski.pl

package pl.japila.android;

import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;

public class ANRDemoActivity extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); View button = findViewById(R.id.button1); button.setOnClickListener(this); }

@Override public void onClick(View v) { try { Thread.sleep(30*1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

Problem?

Page 4: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

http://JacekLaskowski.pl

package pl.japila.android;

import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;

public class ANRDemoActivity extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); View button = findViewById(R.id.button1); button.setOnClickListener(this); }

@Override public void onClick(View v) { try { Thread.sleep(30*1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

30 sekund bezruchu

!

Page 5: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

Application Not Responding (ANR)

• Wątek główny obsługujący UI - “main" lub “thread UI”

• Android chroni przed niewłaściwie (nie)aktywnymi aplikacjami

• Brak odpowiedzi po 5 sek.

• Długotrwałe i/lub blokujące operacje I/O

http://JacekLaskowski.pl

Page 6: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

Wątek główny UI

• Wątek główny

• Activity a wątek główny

http://JacekLaskowski.pl

Page 7: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

java.lang.{Thread | Runnable}

• java.lang.Thread

• java.lang.Runnable

http://JacekLaskowski.pl

Page 8: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

java.lang.concurrent

• java.util.concurrent w Java 5

• Callable

• Executor

• inne uproszczenia

http://JacekLaskowski.pl

Page 9: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

Aktualizacja aktywnego ekranu

• Specjalizowane metody do aktualizacji danych w UI

• Activity.runOnUiThread(Runnable)

• View.post(Runnable)

• View.postDelayed(Runnable, long)

http://JacekLaskowski.pl

@Override public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png"); mImageView.post(new Runnable() { public void run() { mImageView.setImageBitmap(bitmap); } }); } }).start(); }

Page 10: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

android.os.Handler

• Asynchroniczne przetwarzanie zadań z android.os.MessageQueue

• Pojedynczy wątek

• Związany z wątkiem tworzącym, np. wątek UI

• Zadaniami są Message (zalecane) lub Runnable

• Możliwe zadania opóźnione w czasie

• post(Runnable)

• sendMessage(Message)

http://JacekLaskowski.pl

Page 11: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

android.os.HandlerThread

• Utworzenie wątku z Looper

• Fabryka Handler’ów

• start() konieczny do uruchomienia

http://JacekLaskowski.pl

Page 12: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

android.os.Messenger

• Referencja do Handler

• Komunikacja między procesami

http://JacekLaskowski.pl

Page 13: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

android.os.AsyncTask

• Zadanie wykonywane w tle

• Wynik przekazywany do wątku UI

• Klasa pomocnicza nad Thread i Handler

• Krótkie zadania (kilka sekund)

• Pojedyncze wykonanie

• Pojedynczy wątek wykonawczy

http://JacekLaskowski.pl

Page 14: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

Cykl AsyncTask

• execute(Params...) w wątku UI

• doInBackground(Params...)

• onPostExecute(Result)

• executeOnExecutor(Executor, Params...)

http://JacekLaskowski.pl

Page 15: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

android.app.Service

• Długotrwałe zadanie (ponad kilka sekund)

• Brak interakcji z użytkownikiem

• Komunikacja między aplikacjami (procesami)

• <service> w AndroidManifest.xml

• Context.startService()

• Context.bindService()

• Działa w wątku UI

http://JacekLaskowski.pl

Page 16: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

android.app.IntentService

• wzorzec obsługi kolejki zadań

• Asynchroniczne przetwarzanie zadań

• startService(Intent)

• Pojedynczy wątek

• Działa dopóty istnieją zadania

• onHandleIntent(Intent)

http://JacekLaskowski.pl

Page 17: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

android.content.ContentProvider

• Współdzielenie danych między aplikacjami

• Dostawca danych

http://JacekLaskowski.pl

Page 18: Współbieżność w Androidzie - Zrównoleglanie zadań w Javie na platformie Android

Pytania?

@jaceklaskowskihttp://blog.japila.pl