Xamarin android gui зависает при остановке отдельной нити - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над простой игрой в крестики-нолики, используя xamarin. Я также создал однопользовательский режим, в котором процессор играет против вас. проблема в том, что ЦП делает ход сразу после того, как игрок выполняет его ход, поэтому я хочу добавить задержку и отобразить на экране «ЦП думает» примерно на секунду, прежде чем выполнить остальную часть кода. поэтому я создал новую тему

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;
                        }
                    }
                }
            }
        };

но графический интерфейс зависает, когда я нажимаю любую кнопку, и приложение вылетает с этой ошибкой из Visual Studio: Android.Util.AndroidRuntimeException: Only the original thread that created a view hierarchy can touch its views. , Я знаю, что делаю что-то не так, поскольку у меня нет большого опыта работы с потоками в C # или вообще, на самом деле. (быстрое примечание: «инфотекст», который передается в качестве параметра, - это текстовое представление, которое я использую для отображения любой информации игроку, и мне нужно передать ее, поскольку я не могу получить к ней доступ любым другим способом, насколько я знаю, так что было бы здорово, если бы кто-то мог также сказать мне, если есть лучший способ сделать это)

1 Ответ

0 голосов
/ 26 апреля 2018

Вам необходимо обновить свои представления в потоке пользовательского интерфейса, поэтому просто используйте RunOnUiThread, например, так:

в деятельности: RunOnUiThread(()=>infoText.Text = "CPU is thinking.");

во фрагменте: Activity.RunOnUiThread(()=>infoText.Text = "CPU is thinking.");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...