C#Android Xamarin-使用TextView.Text与ElapsedEventHandler崩溃



当我使用 System.Timers.ElapsedEventHandler(checkForMessage)时调用 Print函数时,我的应用程序崩溃了。

我在其他情况下称Print函数,没有问题。

using System;
using Android.App;
using Android.Widget;
using Android.OS;
namespace Ev3BtCom
{
    [Activity(Label = "Ev3BtCom", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        Ev3Messaging _ev3Messaging = new Ev3Messaging();
        bool isParsing = true;
        TextView infosLabel;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);
            ...
            infosLabel = FindViewById<TextView>(Resource.Id.Infos);
            _ev3Messaging = new Ev3Messaging();

            System.Timers.Timer checkForTime = new System.Timers.Timer(500);
            checkForTime.Elapsed += new System.Timers.ElapsedEventHandler(checkForMessage);
            checkForTime.Enabled = true;

            connectBut.Click += async (object sender, EventArgs e) =>
            {
                bool error = false;
                try
                {
                    await _ev3Messaging.Connect(brickNameET.Text);
                }
                catch (Exception ex)
                {
                    Print(ex.Message);
                    error = true;
                }
                if(!error)
                {
                    Print("Connected");
                    isParsing = false;
                }
            };
            ...//Many use of the print function in the same context WITHOUT CRASH
        }
        async void checkForMessage(object source, System.Timers.ElapsedEventArgs e)
        {
            if (!isParsing)
            {
                isParsing = true;
                byte[] datas = new byte[0];
                try
                {
                    datas = await _ev3Messaging.ReceiveText();
                }catch (Exception ex)
                {
                    await _ev3Messaging.SendText("Text", ex.Message);
                    Print(ex.Message);   // MAKES APP CRASH
                }
                if (datas.Length != 0)
                {
                    string printedText = "Received: ";
                    foreach (byte b in datas)
                        printedText += (int)b + ",";
                    Print(printedText);    // MAKES APP CRASH
                    await _ev3Messaging.SendText("Text", printedText);
                }
                Print("Test");   // MAKES APP CRASH
                isParsing = false;
            }
        }
        void Print(string text)
        {
            infosLabel.Text += text + "n"; // When I remove this line, there is no more crash
        }
    }
}

timer.Elapsed事件总是在线程池线程上排队以执行,因此您需要确保在UI线程上更新UI控件。为此,您可以使用类似的RunonUithRead方法:

void Print(string text)
{
    RunOnUiThread(() => infosLabel.Text += text + "n");
}

相关内容

  • 没有找到相关文章

最新更新