współbieżność w androidzie - zrównoleglanie zadań w javie na platformie android
Post on 14-May-2015
829 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
jacek@japila.pl
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
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?
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
!
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
Wątek główny UI
• Wątek główny
• Activity a wątek główny
http://JacekLaskowski.pl
java.lang.{Thread | Runnable}
• java.lang.Thread
• java.lang.Runnable
http://JacekLaskowski.pl
java.lang.concurrent
• java.util.concurrent w Java 5
• Callable
• Executor
• inne uproszczenia
http://JacekLaskowski.pl
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(); }
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
android.os.HandlerThread
• Utworzenie wątku z Looper
• Fabryka Handler’ów
• start() konieczny do uruchomienia
http://JacekLaskowski.pl
android.os.Messenger
• Referencja do Handler
• Komunikacja między procesami
http://JacekLaskowski.pl
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
Cykl AsyncTask
• execute(Params...) w wątku UI
• doInBackground(Params...)
• onPostExecute(Result)
• executeOnExecutor(Executor, Params...)
http://JacekLaskowski.pl
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
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
android.content.ContentProvider
• Współdzielenie danych między aplikacjami
• Dostawca danych
http://JacekLaskowski.pl
top related