想像ですが、showMsg("処理中"); の実装が、そのまま Toast#show() を
呼んでいるため、UI スレッド以外からの実行になって例外がスローされているのでは
ないでしょうか。
もし showMsg(CharSequence message) の実装が↓のようになっているのであれば
private void showMsg(CharSequence message) {
Toast.makeText(ExecutorServiceSampleActivity.this, message,
Toast.LENGTH_SHORT).show();
}
↓のように変更することで、Toast の表示が UIスレッドで実行されるようになります。
private void showMsg(final CharSequence message) {
final Context self = this;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(self, message, Toast.LENGTH_SHORT).show();
}
});
}
runOnUiThread の呼び出しが showMsg の中になるべきか、scheduleAtFixedRate に渡している
Runnable#run() 側になるべきかは設計によります。showMsg が UI スレッドからも
呼ばれる場合は Runnable#run() 側に実装したほうが多少効率は良くなりますが、UI スレッド以外から
呼ぶ場合はすべての呼び出し側に runOnUiThread の記述をする必要があって煩わしいのと
ミスが起こりやすいです。
もし私がUIスレッド、非UIスレッド双方から呼べるようにするのであれば↓のようにUIスレッドから
呼ばれたかどうかを判定して分岐させることで、UI スレッドから呼ばれた場合は Runnable の
インスタンス生成をしないように書くかもしれません。ただ、runOnUiThread の中で同じ様な
UIスレッド判定が実装されているのでここまでする必要もないと判断することも多い気がします。
private void showMsg(final CharSequence message) {
final boolean onUiThread =
Thread.currentThread().equals(getMainLooper().getThread());
if (onUiThread) {
showMsgInner(message);
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
showMsgInner(message);
}
});
}
}
private void showMsgInner(CharSequence message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
2012/3/15 鈴木 吉輝 <s4s...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
--
YAMAZAKI Makoto