Xamarin android gui在暂停单独的线程时冻结

时间:2018-04-26 15:47:36

标签: c# android multithreading xamarin xamarin.android

我正在使用xamarin进行简单的tic tac toe游戏。我还创建了一个单人模式,CPU对你不利。问题是CPU在玩家移动后立即移动,所以我想添加一个延迟并显示" CPU正在思考"在执行其余代码之前,在屏幕上大约一秒钟。所以我创建了一个新的线程

Thread animationThread = new Thread(new ParameterizedThreadStart(CPUAnimation))
            {
                IsBackground = true
            };
            animationThread.Start(infoText); 

这样做,因为我不想在主线程上使用thread.sleep。这是方法的代码:

private static void CPUAnimation(object infTxt)
    {
        // Animation "CPU is thinking"

        TextView infoText = (TextView)infTxt;

        while (true)
        {
            if (cpuIsThinking)
            {
                infoText.Text = "CPU is thinking.";
                Thread.Sleep(333);
                infoText.Text = "CPU is thinking..";
                Thread.Sleep(333);
                infoText.Text = "CPU is thinking...";
                Thread.Sleep(333);
                cpuIsThinking = false;
            }
            Thread.Sleep(100);
        }


    }

这是其中一个方块(按钮)的代码:

button1.Click += delegate
        {
            if (!(infoText.Text.EndsWith("wins!")) && !(infoText.Text.EndsWith(".")) && !cpuIsThinking && one == ' ')
            {
                one = 'X';
                button1.Text = "X";
                bool win = CheckPlayer(infoText);
                if (!win)
                {
                    cpuIsThinking = true;
                    while (true)
                    {
                        if (!cpuIsThinking)
                        {
                            int result = CPU(infoText, first);
                            CPUChoice(result, button1, button2, button3, button4, button5, button6, button7, button8, button9);
                            CheckCPU(infoText);
                            break;
                        }
                    }
                }
            }
        };

但当按下任何按钮时,gui会冻结,应用程序因视觉工作室出现此错误而崩溃: Android.Util.AndroidRuntimeException: Only the original thread that created a view hierarchy can touch its views. 。我知道我做错了什么,因为我在C#或者一般情况下都没有很多线程经验。 (快速说明:" infotext"作为参数传递的是我用来向播放器显示任何信息的textview,我必须通过它,因为我无法以任何其他方式访问它,如据我所知,如果有人能告诉我是否有更好的方法,那就太好了。

1 个答案:

答案 0 :(得分:0)

您需要在UI线程中更新您的视图,因此只需使用RunOnUiThread,就像这样:

活动中的

RunOnUiThread(()=>infoText.Text = "CPU is thinking.");

片段中的

Activity.RunOnUiThread(()=>infoText.Text = "CPU is thinking.");