最終更新:2016-09-23 (金) 14:59:32 (2771d)
Android/スレッド
ドキュメント
関連するクラス
- android.os.Handler - キューイングするためのクラス
- android.os.Looper - メッセージキューを処理するメッセージポンプ
- android.os.HandlerThread
メインスレッド (Android/UIスレッド)
- すべての処理はメインスレッド(UIスレッドとも呼ばれる)で行われる。
- イベントのディスパッチ
- 描画処理
注意点
- ブロック中はイベントもディスパッチされない
- 5秒ブロックされるとANR
- ブロックされる原因
- ネットワークアクセス
- データベースへのクエリ
開放
//スレッドを削除 mLooper = null;
- null代入されて参照を失ったスレッド資源はAndroidのメモリ管理システムによって回収されます
Android/メッセージキュー
- スレッドにはメッセージキューが関連付けされており、UIスレッドではそのメッセージキューから処理を取り出して一つ一つ処理をすることによって、イベント処理を行ったり、 GUI コンポーネントの描画を行うなどしている
- Handler オブジェクトを経由してそれを作成したスレッドのメッセージキューに、メッセージを送ったり Runnable オブジェクトをポストすることが可能になる
クラス
- android.os.Looper
- メインスレッドを監視し、 自身が持っているメッセージキューからメッセージを取り出して処理を実行
- android.os.Handler
- メッセージキューにメッセージを入れる為のもの
ルール
- Andoid UI toolkit is not thread-safe.
- So, you must not manipulate your UI from a worker thread
Do not block the UI thread
Do not access the Android UI toolkit from outside the UI thread
- 解決策
メモ
- ネットワーク通信はメインスレッドから実行してはいけない
UIスレッド外からのUIの操作
- たとえばtextView.setText(hoge);
- android.view.ViewRootImpl$CalledFromWrongThreadException?: Only the original thread that created a view hierarchy can touch its views.
Android NDK (JNI/スレッド)
- ネイティブ上でpthread_create関数を使ってスレッドを生成した場合、JNIではAttachCurrentThread関数、もしくはAttachCurrentThreadAsDaemon?関数でVMに関連付けする
- AttachCurrentThread
- DetachCurrentThread?