質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2114閲覧

CountDownTimerが思ったように動かない

swordone

総合スコア20651

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2015/04/18 16:24

lang

1public class HeartBeatActivity extends Activity{ 2 //必要なものを抜粋 3 private Button timer; 4 private HeartBeat beat; //SurfaceViewを継承したクラス 5 private class PreCountDown extends CountDownTimer{ 6 private final String text = "測定開始まで: "; 7 private int count = 3; 8 9 public PreCountDown(){ 10 super(3000, 1000); 11 timer.setOnClickListener(new View.OnClickListener() { 12 13 @Override 14 public void onClick(View v) { 15 cancel(); 16 beat.setMode(HeartBeat.MODE_NOTHING); 17 timer.setText(R.string.timer); 18 timer.setOnClickListener(HeartBeatActivity.this); 19 Toast.makeText(getApplicationContext(), "キャンセルされました", Toast.LENGTH_LONG).show(); 20 } 21 }); 22 } 23 24 @Override 25 public void onTick(long millisUntilFinished) { 26 timer.setText(text + count); 27 Log.d("count", String.valueOf(count)); 28 Log.d("until", String.valueOf(millisUntilFinished)); 29 count--; 30 } 31 32 @Override 33 public void onFinish() { 34 beat.setMode(HeartBeat.MODE_TIMER); 35 timer.setText("計測中止"); 36 } 37 } 38 //後略 39}

ボタンtimerを押した際に,3秒の予告カウントダウンをボタンに表示する仕組みを作っています.
こちらの意図としては,ボタンに「測定開始まで: 3」の「3」が1秒毎に「2」「1」となり,
その後「計測中止」という表示を出したいのです.
ところが実際に動かしてみると,「3」→「2」のあとおよそ2秒表示の変更がなく,
「計測中止」の表示になってしまいます.
どういうことかとonTickのログで確かめたところ,

04-19 00:57:51.079: D/count(20028): 3
04-19 00:57:51.079: D/until(20028): 2962
04-19 00:57:52.090: D/count(20028): 2
04-19 00:57:52.090: D/until(20028): 1961

と,2回しかonTickが呼ばれていません(残り約1秒の段階でのonTickが呼ばれない).
untilの値は多少ブレがありますが,それぞれ2950前後,1950前後になります.

目的の動作を得るにはどうすればよいでしょうか.教えてください.よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実際に確認していないので細部の回答になってなくてすみません。

KOBE GDG: Android CountDownTimerを使う
によれば、最後の1秒でonTickが間に合っていないような事象があると書かれています。他の記事を見た感じでは似たような事例はあるようです。
もし、カウントダウンが4の場合でも最後の1回が処理されないということでしたら、これと同様の事象である可能性が高そうですね。

根本的な解決にはなりませんが、

  • タイマー時間を少し増やすかインターバル単位を細かくするかしてきっかりの時間を避ける
  • タイマーをもう1つ用意して終了の監視をさせる

などの方法で回避することはできるかも知れません。

投稿2015/04/19 04:42

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2015/04/19 06:45

インターバルを細かくして解決しました.ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問