Xamarin.Forms 蓝牙接口选择
Xamarin.Forms Bluetooth Interface choices
我正在尝试编写带有接口的依赖项注入方法,以便我能够真正为 Android 和 UWP 提供一个用户界面。
一次处理和测试一项功能。该模式正在运行,但我的问题是在 UWP 端,大多数函数都是异步的,而它们不在 Android 上。
所以我的问题是,我是否应该在 android 端 "fake" 异步函数,如果是,怎么办?
这是我的例子:
using System.Collections.Generic;
using System.Threading.Tasks;
namespace XamarinBTArduinoLed
{
public interface IBlueTooth
{
// as a first test, I will try to get a list of paired devices in both Android and UWP
List<string> PairedDevices();
}
}
这适用于 Android,但对于 UWP,它需要
public interface IBlueTooth
{
// as a first test, I will try to get a list of paired devices in both Android and UWP
Task<List<string>> PairedDevices();
}
这不适用于我当前的 Android 实施。那么,假设它是最佳选择,我应该如何将其修改为 "fake" 异步方法?或者有没有其他我没有考虑的方法?
[assembly: Xamarin.Forms.Dependency(typeof(XamarinBTArduinoLed.Droid.BlueToothInterface))]
namespace XamarinBTArduinoLed.Droid
{
public class BlueToothInterface : IBlueTooth
{
public List<string> PairedDevices()
{
List<string> BTItems = new List<string>();
BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;
if (adapter == null) throw new Exception("No BlueTooth Adapter Found.");
if (!adapter.IsEnabled)
{
adapter.Enable();
}
//if (!adapter.IsEnabled)
//{
// throw new Exception("BlueTooth adapter is NOT enabled.");
//}
foreach (var item in adapter.BondedDevices)
{
BTItems.Add(item.Name + " - " + item.Type.ToString());
}
return BTItems;
}
}
}
我发现似乎是最好的方法:
-1- 我更改了接口以获取返回的任务:
public interface IBlueTooth
{
// as a first test, I will try to get a list of paired devices in both Android and UWP
Task<List<string>> PairedDevices();
}
-2- 我相应地修改了 Android 实现:
public Task<List<string>> PairedDevices()
{
List<string> BTItems = new List<string>();
BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;
if (adapter == null) throw new Exception("No BlueTooth Adapter Found.");
if (!adapter.IsEnabled)
{
adapter.Enable();
}
var t = Task.Factory.StartNew(() =>
{
foreach (var item in adapter.BondedDevices)
{
BTItems.Add(item.Name);
}
return BTItems;
});
return t;
}
-3- 我实施了 INotifyPropertyChanged 以在 XAML
中显示
这现在运行良好,我从 Android 和 Windows UWP 获得了我的 USB/Serial 设备列表。为两个平台创建整个过程肯定需要一段时间,但至少看起来我有了一个良好的开端。
如果您有任何意见、建议,请不要犹豫,也许有更好的方法.....
我正在尝试编写带有接口的依赖项注入方法,以便我能够真正为 Android 和 UWP 提供一个用户界面。
一次处理和测试一项功能。该模式正在运行,但我的问题是在 UWP 端,大多数函数都是异步的,而它们不在 Android 上。
所以我的问题是,我是否应该在 android 端 "fake" 异步函数,如果是,怎么办?
这是我的例子:
using System.Collections.Generic;
using System.Threading.Tasks;
namespace XamarinBTArduinoLed
{
public interface IBlueTooth
{
// as a first test, I will try to get a list of paired devices in both Android and UWP
List<string> PairedDevices();
}
}
这适用于 Android,但对于 UWP,它需要
public interface IBlueTooth
{
// as a first test, I will try to get a list of paired devices in both Android and UWP
Task<List<string>> PairedDevices();
}
这不适用于我当前的 Android 实施。那么,假设它是最佳选择,我应该如何将其修改为 "fake" 异步方法?或者有没有其他我没有考虑的方法?
[assembly: Xamarin.Forms.Dependency(typeof(XamarinBTArduinoLed.Droid.BlueToothInterface))]
namespace XamarinBTArduinoLed.Droid
{
public class BlueToothInterface : IBlueTooth
{
public List<string> PairedDevices()
{
List<string> BTItems = new List<string>();
BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;
if (adapter == null) throw new Exception("No BlueTooth Adapter Found.");
if (!adapter.IsEnabled)
{
adapter.Enable();
}
//if (!adapter.IsEnabled)
//{
// throw new Exception("BlueTooth adapter is NOT enabled.");
//}
foreach (var item in adapter.BondedDevices)
{
BTItems.Add(item.Name + " - " + item.Type.ToString());
}
return BTItems;
}
}
}
我发现似乎是最好的方法:
-1- 我更改了接口以获取返回的任务:
public interface IBlueTooth
{
// as a first test, I will try to get a list of paired devices in both Android and UWP
Task<List<string>> PairedDevices();
}
-2- 我相应地修改了 Android 实现:
public Task<List<string>> PairedDevices()
{
List<string> BTItems = new List<string>();
BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;
if (adapter == null) throw new Exception("No BlueTooth Adapter Found.");
if (!adapter.IsEnabled)
{
adapter.Enable();
}
var t = Task.Factory.StartNew(() =>
{
foreach (var item in adapter.BondedDevices)
{
BTItems.Add(item.Name);
}
return BTItems;
});
return t;
}
-3- 我实施了 INotifyPropertyChanged 以在 XAML
中显示这现在运行良好,我从 Android 和 Windows UWP 获得了我的 USB/Serial 设备列表。为两个平台创建整个过程肯定需要一段时间,但至少看起来我有了一个良好的开端。
如果您有任何意见、建议,请不要犹豫,也许有更好的方法.....