2012年7月26日木曜日

Android 現在実行している処理がUIスレッドかどうか判定する

AndroidでUI操作する時はUIスレッドじゃないといけません。
別スレッドからUIを操作するとCalledFromWrongThreadExceptionで爆死してしまいます。

あまり自分は経験していませんが、
今の処理ってUIスレッドだっけー!?と思う時がある場合があるかもしれません。
下手すると、別スレッドからもUIスレッドからも使うメソッドの中でUI操作をしていて、

たまたま今まで別スレッドでUI操作までたどり着いてなかった、なんて事もありえます。(これはもう設計がおかしいすけど)
本番コードで使うかはともかく、あるソースを見たとき、コレってUIスレッド?別スレッド?と思う時があるかもしれません。
そういう時の判定メソッドを作りました。

private boolean isCurrent(){
return Thread.currentThread().equals(getMainLooper().getThread());
}

です。
getMainLooper()はContextのメソッドなので注意して下さい。
単純にThreadから現在のスレッドを取り出し、メインのLooperから取ったスレッドと比較してます。

例えばActivityのonResume()でこうやると
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume:"+isCurrent());
}
onResume:true
が出力されます。

適当に
new Thread(){
public void run() {
Log.d(TAG, "Thread1:"+isCurrent());
};
}.start();
こんな事すると、
Thread1:false
となります。

そんな感じです。

0 件のコメント:

コメントを投稿