Java 如何使用多个postDelayed处理程序

Java 如何使用多个postDelayed处理程序,java,android,android-studio-3.0,handlers,postdelayed,Java,Android,Android Studio 3.0,Handlers,Postdelayed,大家好,我是android DelDeveloping的新手,现在我正在制作一个简单的游戏,当某个颜色发生变化时测试你的反射,以测试我到目前为止学到的东西,但我无法解决出现的问题。 好的,首先我将解释游戏是如何工作的: 当你点击屏幕时会有一个随机延迟,之后你需要尽快再次点击屏幕以获得最佳分数,如果你点击的时间早于延迟结束时,游戏停止并告诉你再试一次。 我的问题是,当我第二次点击时,无论是在延迟之后还是延迟之后,它都会重复代码的一部分,我不知道为什么。我在下面发布了与此相关的代码。如果您需要任何删

大家好,我是android DelDeveloping的新手,现在我正在制作一个简单的游戏,当某个颜色发生变化时测试你的反射,以测试我到目前为止学到的东西,但我无法解决出现的问题。 好的,首先我将解释游戏是如何工作的: 当你点击屏幕时会有一个随机延迟,之后你需要尽快再次点击屏幕以获得最佳分数,如果你点击的时间早于延迟结束时,游戏停止并告诉你再试一次。 我的问题是,当我第二次点击时,无论是在延迟之后还是延迟之后,它都会重复代码的一部分,我不知道为什么。我在下面发布了与此相关的代码。如果您需要任何删除,请告诉我

另外,我认为这和操纵者有关,但我不确定

    final Random random = new Random();
    final int randomNumber = random.nextInt(10) + 1;

    bestScoreView.setText("best score " + bestTime + " ms");
    mainThing.setText("Tap to start");


    mainThing.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            randomTimeDelay = randomNumber * 1000;

            if (previousTapDetected){
                mainThing.setText("You taped too fast");
                mainThing.setBackgroundColor(ContextCompat
                .getColor(getApplicationContext(), R.color.red));

                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mainThing.setText("Try again");
                    }
                }, 750);


            }else if (previousTapDetected = true){
                mainThing.setText("Wait for the color to change");

                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        previousTapDetected=false;
                        mainThing.setText("Tap now");
                        startTime = System.currentTimeMillis();
                        mainThing.setBackgroundColor(ContextCompat
                                .getColor(getApplicationContext(), R.color.red));

                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                mainThing.setText("You scored " + score + " ms");
                                mainThing.setEnabled(false);
                            }
                        }, 500);

                    }
                }, randomTimeDelay);

                endTime = System.currentTimeMillis();
                score = endTime - startTime;

                if (bestTime > score) {
                    bestScoreView.setText("Best score: " + score + " ms");
                    bestTime = score;

                } else if (bestTime  < score){
                    bestScoreView.setText("Best score " + bestTime + " ms");
                }
            }
        }

    });
final Random Random=new Random();
最终整数随机数=random.nextInt(10)+1;
setText(“最佳分数”+最佳时间+“毫秒”);
mainThing.setText(“点击开始”);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
randomTimeDelay=randomNumber*1000;
如果(先前检测到){
mainThing.setText(“你录得太快了”);
主要内容。挫折背景色(ContextCompat
.getColor(getApplicationContext(),R.color.red));
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
mainThing.setText(“重试”);
}
}, 750);
}else if(previousTapDetected=true){
setText(“等待颜色改变”);
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
previousTapDetected=假;
mainThing.setText(“现在点击”);
startTime=System.currentTimeMillis();
主要内容。挫折背景色(ContextCompat
.getColor(getApplicationContext(),R.color.red));
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
mainThing.setText(“你得分”+score+ms”);
mainThing.setEnabled(false);
}
}, 500);
}
}随机时延);
endTime=System.currentTimeMillis();
分数=结束时间-开始时间;
如果(最佳时间>分数){
setText(“最佳分数:+score+“ms”);
最佳时间=分数;
}否则如果(最佳时间<分数){
setText(“最佳分数”+最佳时间+“毫秒”);
}
}
}
});
根据

当您创建一个新的处理程序时,它被绑定到正在创建它的线程的线程/消息队列——从那时起,它将向该消息队列传递消息和可运行文件,并在它们从消息队列中出来时执行它们

而且,在您的代码中,您正试图操作UI元素,因此应在UI线程上创建
处理程序

    Handler handler = new Handler();

    mainThing.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            randomTimeDelay = randomNumber * 1000;

            if (previousTapDetected){
                mainThing.setText("You taped too fast");
                mainThing.setBackgroundColor(ContextCompat
                .getColor(getApplicationContext(), R.color.red));

                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mainThing.setText("Try again");
                    }
                }, 750);

If和elseif条件相同。是的,我知道,我应该说If station,但这不是我的问题。你能详细说明一下你看到的问题吗?当我运行程序并点击第二次时,前一个处理程序似乎又重复了一次,但是我不能准确地知道它发生了什么,所以我可以给你我的应用程序的录音,让你明白我的意思。如果你想让我给你发邮件,请把你的电子邮件传给我。我试图将所有处理程序放在OnClick Listener之外,但部分代码再次重复一次。你的
If
语句有问题。将
Log
放入
postDelayed()
中,查看哪个方法行为错误。