如何正确使用synchronized命令?

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

我正在做一个记忆片假名的游戏。它就像打地鼠一样玩,我有九个闪烁的按钮来显示正确或错误的答案。

我有两个文本视图。一个显示罗马字,另一个显示片假名。我需要他们同步更改。

我有一个包含罗马字的 arrayList,另一个包含相应的片假名。他们的索引排成一行。 例如。罗马字 = [a, i, u, e, o] 片假名 = [ア,イ,ウ,エ,お]

我正在使用以下方法来选择要显示的片假名和罗马字。

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

如果 QandA 是我在处理程序中运行的唯一方法(通过可运行的),则 textViews 会同步更改。

但是,如果我运行使按钮闪烁的可运行程序,textView 将变得不同步。例如。它可能会显示带有“お”的“a”。

我的猜测是 textViews 不同步,因为计算机正在处理 textViews 命令之间的九个按钮。我希望同步命令会强制 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);

                }
            });

        }
    };

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

java multithreading synchronization runnable
1个回答
0
投票

我设法用另一种方式解决了这个问题。

我放弃了在 QandA 方法中设置 hintView 的尝试。相反,我制作了以下方法并将其放入按钮的所有可运行程序中。

   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("オ");
            }
    }
© www.soinside.com 2019 - 2024. All rights reserved.