即使CountDownTimer过期,处理程序仍在运行

问题描述 投票:0回答:1

我创建了一个处理程序,以在运行runnable时显示不同的骰子图像。通常,当我按下“滚动”按钮时,计时器从3倒数,应用程序显示为骰子值。但是有时,即使计时器到期,图像也会继续更改。

我认为我的可运行对象仍在后台运行。所以,为什么我可以在计时器到期时完全停止我的处理程序?

package com.basarballioz.dicerollerdroid;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Random;

public class OneDiceActivity extends AppCompatActivity  {

TextView diceStatus;
Handler handler;
Runnable runnable;
ImageView diceView;
Button rollButton;
CountDownTimer rollTimer = null;
int diceNumber;
TextView diceResult;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.one_dice_activity);


    //MAKE APPLICATION FULLSCREEN
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);


    diceStatus = findViewById(R.id.diceStatus);
    rollButton = findViewById(R.id.rollButton);
    diceView = findViewById(R.id.diceView);
    diceResult = findViewById(R.id.diceResult);
    diceStatus.setText("Press Roll!");


    //Enable this ONLY IF you want to use OnClickListener method instead of onclick button
    /*diceView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //rollDice();
        }
    });*/
}


public void rollDice(View view) {

    diceStatus.setText("Rolling...");
    rollTimer = new CountDownTimer(3000, 1000) {
        @Override
        public void onTick(final long millisUntilFinished) {

            rollButton.setEnabled(false);
            handler = new Handler();
            runnable = new Runnable() {

            @Override
            public void run() {
                Random ranNumber = new Random();
                diceNumber = ranNumber.nextInt(6) + 1;

                switch (diceNumber) {
                    case 1:
                        diceView.setImageResource(R.drawable.dice1);
                        diceResult.setText("1");
                        break;
                    case 2:
                        diceView.setImageResource(R.drawable.dice2);
                        diceResult.setText("2");
                        break;
                    case 3:
                        diceView.setImageResource(R.drawable.dice3);
                        diceResult.setText("3");
                        break;
                    case 4:
                        diceView.setImageResource(R.drawable.dice4);
                        diceResult.setText("4");
                        break;
                    case 5:
                        diceView.setImageResource(R.drawable.dice5);
                        diceResult.setText("5");
                        break;
                    case 6:
                        diceView.setImageResource(R.drawable.dice6);
                        diceResult.setText("6");
                        break;
                    default:
                        break;
                }
                handler.postDelayed(runnable, 100);
            }
        };
        handler.post(runnable);
    }

        @Override
        public void onFinish() {
            rollButton.setEnabled(true);
            showDiceNumber();
            handler.removeCallbacks(runnable);
        }

    }.start();
}

public void showDiceNumber() {
    diceStatus.setText("Your dice is: ");
}

@Override
public void onBackPressed() {
    finish();
}

   @Override
   protected void onDestroy() {
   super.onDestroy();
   }

}

应用程序的GitHub链接:https://github.com/basarballioz/Dice-Rollerdroid

java android android-studio handler countdowntimer
1个回答
0
投票

此行

new CountDownTimer(3000, 1000) 

[创建一个倒数计时器,该计时器在经过1秒,经过2秒以及可能经过3秒之后将调用onTick(无关紧要,但值得验证)。

onTick的每次调用(2或3次调用上,您创建一个新的处理程序并分配给它:

handler = new Handler();

post。每当每个处理程序完成时(现在有2个或3个处理程序),它们都会在100毫秒后重新计划:

handler.postDelayed(runnable, 100);

注意,同样会重新创建可运行实例,这是不必要的。

[调用onFinish时(在2或3个滴答之后)-有2或3个处理程序正在运行,并每100毫秒重复一次。

onFinish仅取消最后一个处理程序或(第2个或第3个处理程序,并且最初的1个或2个处理程序继续运行。

图片...

enter image description here

您肯定不需要多个处理程序和可运行实例。

如果要让骰子面(显示的值)每100毫秒变化3秒钟,然后将onTick更改为仅启动处理程序一次。

(可能需要在帖子中声明您确实想发生的事情。)

所引用的库实现不正确。

© www.soinside.com 2019 - 2024. All rights reserved.