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

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

ただいまの
回答率

87.49%

タイマーが止まってしまいます

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 527

score 1

あるプログラムにタイマーを入れて実行したところ、エミュレーターではカウントはゼロになったが、実際にAndroid端末で実行したら1秒を残してタイマーが止まってしまいます。
どこで止まっているのでしょうか

package jp.codeforfun.bratra;

import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import java.util.Locale;

public class MainQuiz1 extends AppCompatActivity implements View.OnClickListener{

    Button bt_reset;
    // ① 準備(コンポを部屋に置く・コピペOK)
    int mp3a;          // 効果音データ(mp3)
    int mp3b;          // 効果音データ(mp3)
    SoundPool soundPool;    // 効果音を鳴らす本体(コンポ)

    //音楽再生用のメソッド
    public void play_mp3a(){soundPool.play(mp3a,1f , 1f, 0, 0, 1f);}

    public void play_mp3b(){soundPool.play(mp3b,1f , 1f, 0, 0, 1f);};

    private static final long START_TIME = 10000;   //タイマー秒数/[1000]で1秒
    private TextView mTextViewCountDown;            //カウントダウンタイマー
    private long mTimeLeftInMillis = START_TIME;    //開始時のタイマー秒数セット

    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_quiz1);   //対応するレイアウト画面とプログラム画面の結び付け

        // ② 初期化(電源を入れる・コピペOK)
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        } else {
            AudioAttributes attr = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            soundPool = new SoundPool.Builder()
                    .setAudioAttributes(attr)
                    .setMaxStreams(5)
                    .build();
        }
        // ③ 読込処理(CDを入れる)
        mp3a = soundPool.load(this, R.raw.correct_answer,   1);
        mp3b = soundPool.load(this, R.raw.incorrect_answer, 1);

        //タイマー内数値情報取得
        mTextViewCountDown = findViewById(R.id.text_view_countdown);  //レイアウト画面からタイマーレイアウトの取得
        startTimer();                                                   //タイマースタート

        TextView Tv = findViewById(R.id.TitolView);
        Tv .setText("Q1");

        TextView Tv1 = findViewById(R.id.textView1);
        Tv1.setText("つぎの〇のなかの\n"+
                "?はいくつになる?");

        TextView Tv2 = findViewById(R.id.textView2);
        Tv2.setText("こくばん");

        //トップボタン
        Button bt_top = findViewById(R.id.bt_top);             //レイアウト画面よりトップボタンの変情報取得
        bt_top.setText("トップ");                              //「トップ」とテキストセット
        bt_top.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {                     //このボタンが押された場合の処理
                Intent intent = new Intent(getApplication(),MainActivity.class);    //対応するクラスの取得
                startActivity(intent);                                              //アクティビティの移動
            }
        });
        //つぎへボタン
        Button bt_next = findViewById(R.id.bt_next);
        bt_next.setText("わかった!");
        bt_next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTimeLeftInMillis = START_TIME;
                // ④ 再生処理(再生ボタン)
                soundPool.play(mp3a,1f , 1f, 0, 0, 1f);
                Intent intent = new Intent(getApplication(),MainCommentary1.class);
                startActivity(intent);
            }
        });
        //バックボタン
        Button bt_back = findViewById(R.id.bt_back);
        bt_back.setText("もどる");
        bt_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });


        //リセットボタンで画面をリセットさせる
        bt_reset = findViewById(R.id.bt_reset);
        bt_reset . setText("けす");
        bt_reset . setOnClickListener(this);
    }

    //ペイント消去
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.bt_reset) {
            PaintView paintView = findViewById(R.id.view);  //PaintView情報取得
            paintView.clear(); //画面をクリアに
        }
    }

    //タイマーカウントプログラム
    private void startTimer(){
        //タイマーカウント
        CountDownTimer mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
            //ここはよく解らない
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
            }
            @Override
            public void onFinish() {
            }
        }.start();
    }

    //カウントダウン
    private void updateCountDownText(){
        //分カウント
        int minutes = (int)(mTimeLeftInMillis/1000)/60;
        //秒カウント
        int seconds = (int)(mTimeLeftInMillis/1000)%60;
        //タイマーにカウントを代入(おそらく)
        String timerLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
        mTextViewCountDown.setText(timerLeftFormatted);

        //秒数が[0]になると次ページへ飛ぶ(タイムアップ処理)
        if(seconds == 0 && minutes == 0 ){
            mTimeLeftInMillis = START_TIME;
            // ④ 再生処理 (再生ボタン)
            soundPool.play(mp3b,1f , 1f, 0, 0, 1f);
            //ダイアログの作成
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            //メインメッセージの表示
            builder.setMessage("じかんぎれだよ!")
                    .setTitle("ざんねん!")
                    .setCancelable(false)        //ダイアログの外をタップしてもキャンセルされないように設定
                    .setIcon(R.drawable.cross)
                    //ボタンを設置し、ボタン内に文字を代入
                    .setPositiveButton("かいせつページへいく!", new DialogInterface.OnClickListener() {
                        //ダイアログ内ボタン情報取得&クリック判定
                        public void onClick(DialogInterface dialog, int id) {
                            // ボタンをクリックしたときの動作
                            Intent intent = new Intent(getApplication(),MainCommentary1.class);
                            startActivity(intent);
                        }
                    });
            //ダイアログを閉じる
            builder.show();
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dodox86

    2020/12/16 15:37

    > 1秒を残してタイマーが止まってしまいます。

    「1秒が残っている」とはどこで判断したのでしょうか。あくまで推測ですが、単に表示更新の問題だけで、実はタイマー自体は0秒までちゃんとカウントダウンされているのでは?

    キャンセル

  • HS_Student

    2020/12/16 16:01 編集

    ありがとうございます。
    1秒が残っていると判断したのは、0秒になるとダイアログが表示されるようにプログラムしていたので、そちらで判断いたしました。

    キャンセル

回答 1

checkベストアンサー

+1

CountDownTimerを使ってはいけない2つの理由「Android」(1) – FeeeeeLog

ということで、最後の0秒のイベントが呼び出されないってことかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/12/17 12:31

    回答ありがとうございます。
    誤差が生じることは理解できました。また、そんなことが起こるとは思いもしなかったのでいただいた情報は大変ありがたいです。
    現在、ダイアログが出る設定を0秒から1秒に変更したところダイアログの表示に成功しました。0秒では成功しなさそうなので、表示自体を一秒ずらす方法をとってみようと思います。

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る