如何在两个布局文件之间保持一致

时间:2014-08-16 15:06:09

标签: c# bluetooth xamarin xamarin.android

所以我现在的问题是我有3个文件,两个布局文件和两个共享的自定义蓝牙类,一切正常,正如我在主布局页面上所期望的那样引用蓝牙类时,我的问题是我有一个连接功能,我在用户请求运行,然后我重定向到我的第二个视图。该函数如下所示:

public void ConnectToDevice()
    {
        BluetoothSocket = SelectedBluetoothDevice.CreateRfcommSocketToServiceRecord(Java.Util.UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));
        BluetoothAdapter.CancelDiscovery();
        BluetoothSocket.Connect();
    }

SelectedBluetoothDevice此处由用户在主布局上设置,然后重定向到第二个。当我运行它时,一切似乎都很好,但是当我打开新视图供用户执行更高级的任务(发送,接收串行数据)时,类被重置。 BluetoothSocket变为空,一切都需要重新计算,等等。当我打开新视图时,有没有办法保持这些数据不变,我能想到的唯一选择是将变量作为参数传递给新视图然后重新 - 将它们设置为蓝牙类,但我希望能够采用更简单的方式,而不必再进行任何黑客攻击了。

1 个答案:

答案 0 :(得分:1)

正如我所假设的,您的BluetoothWorker存储为第一个视图的字段。如果我是对的,问题出现在垃圾收集器中,当第一个视图关闭甚至销毁时,可能会收集此字段。我认为您可以使用singleton pattern来解决您的问题。这是简单的threafsafe通用单例的辅助类。

/// <summary>
/// Allows to working with class as singleton.
/// </summary>
/// <typeparam name="T"></typeparam>
public class Singleton<T> where T : class, new()
{
    /// <summary>
    /// Gets the sole instance.
    /// </summary>
    /// <value>The instance.</value>
    static T Instance
    {
        get { return InternalContainer.Instance; }
    }

    /// <summary>
    /// Internal instance that guaranties sole instantination.
    /// </summary>
    private class InternalContainer
    {
        /// <summary>
        /// The sole instance.
        /// </summary>
        public static readonly T Instance;

        /// <summary>
        /// Initializes the <see cref="Singleton&lt;T&gt;.InternalContainer"/> class.
        /// </summary>
        static InternalContainer()
        {
            Instance = new T();
        }
    } 
}

只需创建自己的BluetoothWorkerSingleton : Singleton<BluetoothWorker>并使用Instance属性。