我创建了一个处理程序,以在运行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
此行
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个处理程序继续运行。
图片...
您肯定不需要多个处理程序和可运行实例。
如果要让骰子面(显示的值)每100毫秒变化3秒钟,然后将onTick
更改为仅启动处理程序一次。
(可能需要在帖子中声明您确实想发生的事情。)
所引用的库实现不正确。