最終更新:2017-03-17 (金) 12:31:07 (2569d)
Android/非同期処理
Android/スレッド
android.os.Looper
- メインスレッドは内部的にandroid.os.Looperを持っており、その中にはMessage Queueが含まれる
- 無限にループしながら自分が属したスレッドのMessage Queueに入ってきたMessageやRunnableオブジェクトを順に取り出してこれを処理するHandlerに伝える
android.os.Handler
- HandlerはLooperから受けたMessageを実行、処理したり、他のスレッドからメッセージを受けてMessage Queueに入れる役割
- 処理の実行
- Handler.handleMessage?
- キューイング
- 例
Handler handler = new Handler(); handler.post(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } });
android.os.Message
- スレッド間通信する内容を盛り込むオブジェクト
android.os.HandlerThread
- 一般的なスレッド(java.lang.Thread)を拡張したクラスで、内部に繰り返しループするLooperを持っている
- コンストラクタ
- HandlerThread(String threadName)
- 例
// 別スレッド生成 -> 開始 HandlerThread handlerThread = new HandlerThread("other"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper()); handler.post(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } });
android.os.AsyncTask
- AsyncTaskを使用してスケジューリングできるタスク数には制限があり、数秒程度の短いタスクでのみ理想的に動作するという限界がある
Java/スレッド
- 新しい実行のスレッドを作成するには 2 通りの方法がある
java.lang.Threadクラスの継承
class HogeThread extends Thread {void run(){...}} HogeThread t = new HogeThread(); t.start();
java.lang.Runnableインターフェイスの実装
class HogeRun implements Runnable {void run(){...}} HogeRun r = new HogeRun(); new Thread(r).start();
クラスとか
- android.app.Service
- android.app.IntentService - タスクをキューに追加して非同期処理
- java.util.Timer
- java.util.TimerTask
- android.app.AlarmManager?
- android.app.PendingIntent
- android.os.Handler
用途別
短い
長い
- java.util.concurrent.Executor
- java.util.concurrent.ThreadPoolExecutor
- java.util.concurrent.FutureTask
関連
参考
- https://realm.io/jp/news/android-thread-looper-handler/
- http://android-developers.blogspot.jp/2009/05/painless-threading.html