所以我现在的问题是我有3个文件,两个布局文件和两个共享的自定义蓝牙类,一切正常,正如我在主布局页面上所期望的那样引用蓝牙类时,我的问题是我有一个连接功能,我在用户请求运行,然后我重定向到我的第二个视图。该函数如下所示:
public void ConnectToDevice()
{
BluetoothSocket = SelectedBluetoothDevice.CreateRfcommSocketToServiceRecord(Java.Util.UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));
BluetoothAdapter.CancelDiscovery();
BluetoothSocket.Connect();
}
SelectedBluetoothDevice
此处由用户在主布局上设置,然后重定向到第二个。当我运行它时,一切似乎都很好,但是当我打开新视图供用户执行更高级的任务(发送,接收串行数据)时,类被重置。 BluetoothSocket
变为空,一切都需要重新计算,等等。当我打开新视图时,有没有办法保持这些数据不变,我能想到的唯一选择是将变量作为参数传递给新视图然后重新 - 将它们设置为蓝牙类,但我希望能够采用更简单的方式,而不必再进行任何黑客攻击了。
答案 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<T>.InternalContainer"/> class.
/// </summary>
static InternalContainer()
{
Instance = new T();
}
}
}
只需创建自己的BluetoothWorkerSingleton : Singleton<BluetoothWorker>
并使用Instance
属性。