我正在尝试获取可用wifi网络的列表并将其显示在列表视图中。在PCL项目中,我创建了一个接口“ IWifiService”。
public interface IWifiService
{
void GetWifiList();
}
在android项目中,使用WifiService类来获取所有网络列表。
[assembly:Dependency(typeof(WifiService))]
namespace WifiConnectivity.Droid.WifiService
{
public class WifiService : IWifiService
{
private static WifiManager wifi;
private WifiReceiver wifiReceiver;
public static List<string> WiFiNetworks;
public void GetWifiList()
{
WiFiNetworks = new List<string>();
var context = Android.App.Application.Context;
wifi = (WifiManager)context.GetSystemService(Context.WifiService);
wifiReceiver = new WifiReceiver();
context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
}
public class WifiReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
IList<ScanResult> scanWifiNetworks = wifi.ScanResults;
foreach(ScanResult wifinetwork in scanWifiNetworks)
{
WiFiNetworks.Add(wifinetwork.Ssid);
}
}
}
}
}
然后从ViewModel中,我像这样调用依赖服务:
var service = DependencyService.Get<IWifiService>();
service.GetWifiList();
现在,类WifiReceiver无法返回任何内容,因此我无法在ViewModel中获取那些网络列表。如何将这个列表放入ViewModel中?
答案 0 :(得分:1)
我建议您在GetWifiList方法中返回一个列表,以便界面看起来像这样:
public interface IWifiService
{
void GetWifiList(Action<List<string>> action);
}
然后您的GetWifiList方法将如下所示:
public static Action<List<string>> CallBackAction;
public void GetWifiList(Action<List<string>> callBackMethod)
{
WiFiNetworks = new List<string>();
var context = Android.App.Application.Context;
wifi = (WifiManager)context.GetSystemService(Context.WifiService);
wifiReceiver = new WifiReceiver();
context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
CallBackAction= callBackMethod;
}
然后在OnRecieve方法中执行回调方法:
public override void OnReceive(Context context, Intent intent)
{
IList<ScanResult> scanWifiNetworks = wifi.ScanResults;
foreach(ScanResult wifinetwork in scanWifiNetworks)
{
WiFiNetworks.Add(wifinetwork.Ssid);
}
CallBackAction(WiFiNetworks);
}
现在,回调方法中最重要的部分以及作为参数传递的内容:
System.Action基本上是一个方法引用,您可以在其中传递回调方法的名称,如下所示:
var service = DependencyService.Get<IWifiService>();
service.GetWifiList(MyCallBackAction);
MyCallBackAction如下:
public void MyCallBackAction(List<string> wifiNetworks)
{
// this method will be called every time you get a callback at OnRecieve
}