我正在使用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,我必须通过它,因为我无法以任何其他方式访问它,如据我所知,如果有人能告诉我是否有更好的方法,那就太好了。
答案 0 :(得分:0)
您需要在UI线程中更新您的视图,因此只需使用RunOnUiThread
,就像这样:
:RunOnUiThread(()=>infoText.Text = "CPU is thinking.");
:Activity.RunOnUiThread(()=>infoText.Text = "CPU is thinking.");