スレッドとは?
状態:-
閲覧数:4,461
投稿日:2013-09-29
更新日:2014-03-26
・アプリが起動するとシステムは、割当てられたプロセスの中で、メインスレッドと呼ばれる「アプリケーション実行のスレッド」を立ち上げる
UIスレッド
・メインスレッドは、様々なイベントをハンドリングしたり、UIの操作を受け付けたりする必要があるため、UIスレッドとも呼ばれる
・適切なウィジェットに対しイベントを配信するという重要な役割を担っている
※メインスレッド = UIスレッド
・Processes and Threads
・スレッド
インスタンス化
・各々のコンポーネントに対して個別にスレッドを作るわけではないので、同じプロセス上のコンポーネントは全て、UIスレッド上でインスタンス化される
・キーが押された等のシステムのコールバックメソッドもUIスレッド上で呼ばれる
UIスレッド
・メインスレッドは、様々なイベントをハンドリングしたり、UIの操作を受け付けたりする必要があるため、UIスレッドとも呼ばれる
・適切なウィジェットに対しイベントを配信するという重要な役割を担っている
※メインスレッド = UIスレッド
・Processes and Threads
・スレッド
インスタンス化
・各々のコンポーネントに対して個別にスレッドを作るわけではないので、同じプロセス上のコンポーネントは全て、UIスレッド上でインスタンス化される
・キーが押された等のシステムのコールバックメソッドもUIスレッド上で呼ばれる
Androidスレッドの特徴
シングルスレッド
single thread
・Androidは、キーのイベント配信等を行うスレッドが1つの「シングルスレッド」モデル
シングルスレッドとは?
アプリケーションソフトなどが、並行処理などを行わずにすべての演算を逐次に処理していくこと。スレッドと呼ばれる処理単位を複数生成し、並行して複数の処理を行う「マルチスレッド」に対応する語。
シングルスレッドで動作するプログラムは複数の動作を同時に行うように設計されておらず、すべての動作が逐次的に行われる。このため、時間のかかる処理を始めるとユーザの入力を受け付けられなくなったりする
シングルスレッドで動作するプログラムは複数の動作を同時に行うように設計されておらず、すべての動作が逐次的に行われる。このため、時間のかかる処理を始めるとユーザの入力を受け付けられなくなったりする
他スレッドからの操作
他スレッドからUI操作禁止
・他のスレッドからUI操作することは禁止されている
・この操作を行った場合、例外が発生してアプリがクラッシュする
時間がかかる処理を行うと?
固まったように見える
・Androidで時間がかかる処理を行うと、一時的にインターフェースが固まったようになる
・重い処理をメインスレッド(=UIスレッド)で行うことになるので、画面の処理が止まったように見える
ユーザ操作を受け付けない
・しかも、その処理が終わるまで、ユーザの操作を受け付けなくなってしまう
・そうするとアプリは正規の処理をしているのにも関わらず、ユーザはアプリがハングしてしまったのではないか?と疑問を抱いてしまう。また、反応が遅くて不快に思う
→使い勝手の悪いインターフェース
強制終了を選択
・インターフェースが固まってしばらくすると、応答しません的なエラーメッセージが表示される
・そこで、ユーザーが強制終了を選択すると、正常処理中にも関わらず、アプリは強制終了してしまう
ANR
Application Not Responding
・ネットワーク通信やデータベース操作など、時間を要する処理をメインスレッド上で実行すると、すべてのUIのイベントを受け付けることができなくなってしまう
・5秒以上この状態が続くと、ANR(Application Not Responding)と扱われ警告ダイアログが表示される
重い処理に対応するには?
対策
・非同期処理で画面系と処理を分けてこのエラーを出ないようにする
・重い処理はマルチスレッドを使い、バックグラウンド(=ワーカースレッド)で処理する必要がある
何のために非同期処理を行うのか?
非同期処理は必須。その理由は?
・アプリケーションのユーザビリティを向上させるため
Androidシングルスレッドモデルのルール
2つのルール
・Androidのシングルスレッドモデルには2つのルールがある
1.UIスレッドをブロックしない
2.UIスレッド外からAndroidのUIツールキットへアクセスしない
・メインスレッド以外で画面のインターフェースを変更しようとしない
(例 … textViewの文字を別スレッドから終了メッセージを表示、など)