Привязка данных из проекта Android к ViewModel - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь получить список доступных сетей Wi-Fi и отобразить его в виде списка.В проекте 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?

1 Ответ

0 голосов
/ 13 февраля 2019

Я бы посоветовал вам вернуть List в ваш метод 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);
    }

А теперь самая важная часть метода обратного вызова и что передать в качестве аргумента:

Система.Действие - это, по сути, ссылка на метод, где вы передаете имя метода обратного вызова, как показано ниже:

    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
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...