scheduleAtFixedRateが繰り返し実行されない

565 views
Skip to first unread message

鈴木 吉輝

unread,
Mar 15, 2012, 5:52:50 AM3/15/12
to 日本Androidの会
皆さんお疲れ様です.
繰り返し処理をするためにscheduleAtFixedRateメソッドを用いました.
ログについては最初の一度目は実行されるのですが,ログの表示は繰り返し処理されず一度きりです.
showMsgメソッドはトーストを用いて表示するメソッドですが,こちらは一度も実行されません.

ScheduledExecutorService executor =
Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(new Runnable () {

@Override
public void run() {
// TODO Auto-generated method stub
Log.v("run()","動作中");
showMsg("処理中");
}

}, 10000, 10000, TimeUnit.MILLISECONDS);

どのような原因が考えられるでしょうか.

Makoto Yamazaki

unread,
Mar 15, 2012, 4:29:07 PM3/15/12
to android-g...@googlegroups.com
zaki です。

想像ですが、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

鈴木 吉輝

unread,
Mar 17, 2012, 10:35:00 PM3/17/12
to 日本Androidの会
ご連絡ありがとうございます.まさにそのとおりでした.
UIスレッドからの実行であることを考慮していませんでした.
解決案まで考えてくださってありがとう御座います.助かります.
> 2012/3/15 鈴木 吉輝 <s4sh...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages