新的OnCreate()调用后,Xamarin Android RunOnUiThread()无法正常工作

时间:2017-02-16 15:19:48

标签: c# android multithreading xamarin bluetooth

我在Android 6.0 API 23智能手机上有一个简单的应用程序。该应用程序附带蓝牙条码扫描仪。蓝牙类有一个异步方法,它传递输入字符串。 这是我的主要活动课程:

using Android.App;
using Android.OS;
using Android.Widget;

namespace TestOnCreate
{
    [Activity(Label = "TestOnCreate", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        private Bluetooth bluetooth = null;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);

            StartBluetooth();
        }

        private void StartBluetooth()
        {
            try
            {
                bluetooth = new Bluetooth(ProcessBluetoothInput);
                bluetooth.StartBluetooth("00:19:01:47:0E:70");

            }

            catch (System.Exception exc)
            {
                System.Console.WriteLine(exc);
            }
        }

        public void ProcessBluetoothInput(string text)
        {
            try
            {
                RunOnUiThread(() =>
                {
                    FindViewById<TextView>(Resource.Id.textView1).Text = text;
                });
            }

            catch (System.Exception exc)
            {
                System.Console.WriteLine(exc);
            }
        }
    }
}

扫描仪正在运行并将有效信息发送到textView1。 现在,当第二次调用OnCreate()时(如果屏幕旋转或手机处于待机状态),连接将丢失。 ProcessBluetoothInput(字符串文本) 仍然被调用,但RunOnUiThread无效。

我做错了什么? 如果经常调用OnCreate,那么为什么初始化我的可变数据的正确原因是什么?

1 个答案:

答案 0 :(得分:1)

您可以阻止因方向更改而重新启动活动。

  

...通过在ActivityAttribute中设置ConfigurationChanges,应用程序还可以防止在方向更改时重新启动活动,如下所示:

window.addEventListener("load", Loaded);

function Loaded() {
  window.addEventListener("resize", Resized);

  function Resized() {
    var WindowWidth = window.innerWidth;
    var WindowHeight = window.innerHeight;
    var Span1 = document.getElementById("Span1");
    var Span2 = document.getElementById("Span2");
    if (WindowWidth <= 800) {
      Span1.style.width = .4;
    }
    if (WindowHeight <= 600) {
      Span2.style.height = 1;
    }
  }
}

示例:

ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize

re:Preventing Activity Restart