CountdownTimer 在 Runnable 中不是 运行
CountdownTimer is not Running in Runnable
你好开发者这个问题对一些读者来说可能看起来很愚蠢,它可能以前已经回答过,但我在这个论坛上看到了很多关于我的问题的答案,但我无法理解其中一个。所以,如果可以的话,请善待并回答我的问题。
问题是我正在尝试开发类似游戏的东西,并尝试添加计算机或 AI 玩家来对抗人类玩家。
为此,我在 OnCreate
方法中添加了一个 CountdownTimer
,它只运行一次,因为 OnCreate 只执行一次。但是,当我尝试在 runnable 和 while 循环中添加一个 while 循环时,我添加了相同的 CountdownTimer,但它开始给我错误。
if(player2_name.equals("Computer")) {
Runnable r = new Runnable() {
@Override
public void run() {
while (player2_name.equals("Computer")) {
CountDownTimer computer_player;
ct = 5;
firstplayer_game_button.setClickable(false);
computer_player = new CountDownTimer(5000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
ct = ct - 1;
// timer_counter.setText("" + ct);
if (ct == 1) {
firstplayer_game_button.setClickable(true);
}
}
@Override
public void onFinish() {
// secondplayer_game_button.setBackgroundResource(R.drawable.button_player_2);
// firstplayer_game_button.setBackgroundResource(R.drawable.button_player_1);
// firstplayer_game_button.setClickable(true);
if (player2_name.equals("Computer")) {
secondplayer_game_button.setClickable(false);
} else {
secondplayer_game_button.setClickable(true);
}
if (checker != 1) {
Click_Condition_checker(2);
}
}
};
computer_player.start();
}
}
};
Thread mythread = new Thread(r);
mythread.start();
我知道 Runnable 不能直接与 UI 交互,为此我们需要处理程序,这就是我注释所有 UI 接口的原因。但仍然没有运气。不幸的是,我无法识别错误。如果有人可以提供帮助,那么对于像我这样愚蠢的开发人员来说将是非常友好的。
不确定您的目标,但您的 while 循环似乎很麻烦。在测试一个字符串而不改变它的值时,它会一遍又一遍地 运行(然后创建那么多 CountdownTimer,我认为这不是你的意图)
首先,您不需要使用 Runnable
来制作 CountDownTimer
作品。这是因为如果Activity
.
里面的代码运行,CountDownTimer
可以直接和UI交互
其次,您不应该在代码中使用 while 循环。特别是对于以下代码:
while (player2_name.equals("Computer")) {
CountDownTimer computer_player;
...
computer_player = new CountDownTimer(5000, 1000) {}
...
}
这意味着您正在创建新对象,直到您耗尽所有设备内存或直到 player2_name 不是 "Computer"
。
您应该改用布尔标志。
我想你需要的是可以通过像这样重新启动 CountDownTimer
来实现:
// use a more readable variable name instead of computer_player
final CountDownTimer cdtPlayer = new CountDownTimer(5000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// do something
}
@Override
public void onFinish() {
// do something
// restart to do all again
cdtPlayer.start();
}
};
cdtPlayer.start();
关于您的以下声明:
If Someone can help then it would be very kind for a foolish developer like me.
每个人在开始学习的时候都是傻子。不要对自己太苛刻 ;)
你好开发者这个问题对一些读者来说可能看起来很愚蠢,它可能以前已经回答过,但我在这个论坛上看到了很多关于我的问题的答案,但我无法理解其中一个。所以,如果可以的话,请善待并回答我的问题。
问题是我正在尝试开发类似游戏的东西,并尝试添加计算机或 AI 玩家来对抗人类玩家。
为此,我在 OnCreate
方法中添加了一个 CountdownTimer
,它只运行一次,因为 OnCreate 只执行一次。但是,当我尝试在 runnable 和 while 循环中添加一个 while 循环时,我添加了相同的 CountdownTimer,但它开始给我错误。
if(player2_name.equals("Computer")) {
Runnable r = new Runnable() {
@Override
public void run() {
while (player2_name.equals("Computer")) {
CountDownTimer computer_player;
ct = 5;
firstplayer_game_button.setClickable(false);
computer_player = new CountDownTimer(5000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
ct = ct - 1;
// timer_counter.setText("" + ct);
if (ct == 1) {
firstplayer_game_button.setClickable(true);
}
}
@Override
public void onFinish() {
// secondplayer_game_button.setBackgroundResource(R.drawable.button_player_2);
// firstplayer_game_button.setBackgroundResource(R.drawable.button_player_1);
// firstplayer_game_button.setClickable(true);
if (player2_name.equals("Computer")) {
secondplayer_game_button.setClickable(false);
} else {
secondplayer_game_button.setClickable(true);
}
if (checker != 1) {
Click_Condition_checker(2);
}
}
};
computer_player.start();
}
}
};
Thread mythread = new Thread(r);
mythread.start();
我知道 Runnable 不能直接与 UI 交互,为此我们需要处理程序,这就是我注释所有 UI 接口的原因。但仍然没有运气。不幸的是,我无法识别错误。如果有人可以提供帮助,那么对于像我这样愚蠢的开发人员来说将是非常友好的。
不确定您的目标,但您的 while 循环似乎很麻烦。在测试一个字符串而不改变它的值时,它会一遍又一遍地 运行(然后创建那么多 CountdownTimer,我认为这不是你的意图)
首先,您不需要使用 Runnable
来制作 CountDownTimer
作品。这是因为如果Activity
.
CountDownTimer
可以直接和UI交互
其次,您不应该在代码中使用 while 循环。特别是对于以下代码:
while (player2_name.equals("Computer")) {
CountDownTimer computer_player;
...
computer_player = new CountDownTimer(5000, 1000) {}
...
}
这意味着您正在创建新对象,直到您耗尽所有设备内存或直到 player2_name 不是 "Computer"
。
您应该改用布尔标志。
我想你需要的是可以通过像这样重新启动 CountDownTimer
来实现:
// use a more readable variable name instead of computer_player
final CountDownTimer cdtPlayer = new CountDownTimer(5000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// do something
}
@Override
public void onFinish() {
// do something
// restart to do all again
cdtPlayer.start();
}
};
cdtPlayer.start();
关于您的以下声明:
If Someone can help then it would be very kind for a foolish developer like me.
每个人在开始学习的时候都是傻子。不要对自己太苛刻 ;)