java 如何正确使用synchronized命令?

b5lpy0ml  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(142)

我在做一个记忆片假名的游戏,就像打鼹鼠一样,我有九个按钮,可以 Flink 显示正确或错误的答案。
我有两个文本视图。一个显示罗马字和其他片假名。我需要他们改变同步。
我有一个arrayList包含romaji,另一个包含对应的片假名,它们的索引排成一行。例如romaji = [a,i,u,e,o] katakana = [,,,]
我使用下面的方法来选择要显示的片假名和罗马字。

public void QandA(){
    synchronized (this){
    pickFromArray = ThreadLocalRandom.current().nextInt(0, arraySize);
    textView29.setText(listromT.get(pickFromArray));
    hintView.setText(listT.get(pickFromArray));}
}

如果QandA是我在处理程序中运行的唯一方法(通过runnable),textView将同步更改。
然而,如果我运行使按钮 Flink 的runnables,textview将会改变为不同步。eidogg。它可能会显示“a”与“oriese "。
我猜textView不同步是因为计算机正在处理textView命令之间的九个按钮,我希望synchronize命令会强制CPU将QandA方法作为不间断块读取,但它们仍然不同步。
我如何正确使用它?或者我应该使用另一个命令来代替它?
谢谢
编辑:
我有一个SetQuestion runnable,可以递归运行。
在onCreate中:

handler.postDelayed(SetQuestion, 0);

SetQuestion可运行:

public Runnable SetQuestion = new Runnable() {

        public void run() {

            runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    Qtimer++;
                    if (Qtimer%10==1){
                        QandA();
                    }
                    if (Qtimer%10==6){
                        QandA();
                    }
                    if (Qtimer>199){
                        Qtimer=110;
                    }
                    handler.postDelayed(this, 1000);

                }
            });

        }
    };

我也尝试过使用QandA的TimerTasks来改变按钮,但我得到了同样的结果。罗马字和片假名的变化不同步,尽管按钮看起来工作正常(即颜色和文本同步变化)。

nom7f22z

nom7f22z1#

我设法用另一种方法解决了这个问题。
我放弃了尝试在QandA方法中设置hintView,而是创建了以下方法,并将其放在按钮的所有runnables中。

public void katakana(){
            if (pickFromArray ==0){
                hintView.setText("ア");
            }
            if (pickFromArray ==1){
                hintView.setText("イ");
            }
            if (pickFromArray ==2){
                hintView.setText("ウ");
            }
            if (pickFromArray ==3){
                hintView.setText("エ");
            }
            if (pickFromArray ==4){
                hintView.setText("オ");
            }
    }

相关问题