Обнаружение изменений подключения Xamarin Forms

В настоящее время я использую Xamarin.Essentials.Connectivity, чтобы проверить свое интернет-соединение. Я использую приведенный ниже код, чтобы проверить, есть ли Интернет, прежде чем совершать транзакцию. Как я могу проверить, изменилось ли мое подключение к Интернету в моих формах? Например, у меня есть две (2) формы Форма входа и Главное меню, независимо от того, в какой форме я сейчас нахожусь, когда я выключаю Wi-Fi на моем устройстве, отображается предупреждение об отсутствии подключения к Интернету. Как я могу этого добиться?

var current = Connectivity.NetworkAccess;

//Check if there is an internet connection
if (current == NetworkAccess.Internet)
{
   DisplayAlert("Ok", "Connected", "Ok");
}
else {
   DisplayAlert("Error", Connected, "Ok");
}

Я пытался использовать этот код из документации Xamarin.Essentials.Connectivity, но я не знаю, как это использовать и где это разместить

public class ConnectivityTest
{
   public ConnectivityTest()
   {
       // Register for connectivity changes, be sure to unsubscribe when finished
       Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;
   }

   void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs  e)
   {
       var access = e.NetworkAccess;
       var profiles = e.Profiles;
   }
}

Мой код для синхронизации

public async void FirstSyncUser(string host, string database, string contact)
    {
        try
        {
            var db = DependencyService.Get<ISQLiteDB>();
            var conn = db.GetConnection();

            var sql = "SELECT * FROM tblUser WHERE ContactID = '" + contact + "'";
            var getUser = conn.QueryAsync<UserTable>(sql);
            var resultCount = getUser.Result.Count;

            //Check if the user has been sync
            if (resultCount < 1)
            {
                try
                {
                    syncStatus.Text = "Syncing User Data";

                    var link = Constants.requestUrl + "Host = " + host + "&Database = " + database + "&Contact = " + contact + "&Request=8qApc8";
                    string contentType = "application/json";
                    JObject json = new JObject
                    {
                        { "ContactID", contact }
                    };

                    HttpClient client = new HttpClient();
                    var response = await client.PostAsync(link, new StringContent(json.ToString(), Encoding.UTF8, contentType));

                    if (response.IsSuccessStatusCode)
                    {
                        var content = await response.Content.ReadAsStringAsync();

                        if (content != "")
                        {
                            var userresult = JsonConvert.DeserializeObject<List<UserData>>(content);
                            for (int i = 0; i < userresult.Count; i++)
                            {
                                syncStatus.Text = "Syncing User Data " + (i + 1) + " out of " + userresult.Count;

                                var item = userresult[i];
                                var contactID = item.ContactID;
                                var userID = item.UserID;
                                var userPassword = item.UserPassword;
                                var userType = item.UserType;
                                var userStatus = item.UserStatus;
                                var lastSync = Convert.ToDateTime(item.LastSync);
                                var serverUpdate = Convert.ToDateTime(item.ServerUpdate);
                                var mobileUpdate = Convert.ToDateTime(item.MobileUpdate);

                                var user = new UserTable
                                {
                                    ContactID = Convert.ToInt32(contactID),
                                    UserID = userID,
                                    UserPassword = userPassword,
                                    UserType = userType,
                                    UserStatus = userStatus,
                                    LastSync = lastSync,
                                    ServerUpdate = serverUpdate,
                                    MobileUpdate = mobileUpdate
                                };

                                await conn.InsertAsync(user);
                            }
                        }
                        else
                        {
                            //Proceed to next function
                            FirstSyncContacts(host, database, contact);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.Write("Syncing User Error " + ex.Message);
                }

                //Proceed to next function
                FirstSyncContacts(host, database, contact);
            }
            //If not get the user
            else
            {
                SyncUser(host, database, contact);
            }
        }
        catch (Exception ex)
        {
            Console.Write("Syncing User Error " + ex.Message);
        }
    }

Он использует его глобально, настраивая обработчик на уровне приложения (lication). В противном случае добавьте / удалите обработчик в событиях жизненного цикла страницы (чтобы избежать дублирования, определите подкласс страницы с этими событиями, а затем используйте этот подкласс в качестве подкласса для всех остальных страниц).

SushiHangover 03.10.2018 02:23

@SushiHangover, можешь мне показать?

loot verge 03.10.2018 02:24

@SushiHangover, можешь показать мне, как и где мне это поставить? Чтобы использовать его во всем мире

loot verge 03.10.2018 02:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
1 462
1

Ответы 1

can you show me how and where do I put this? In order to use it globally

Вот пример использования Essentials.Connectivity на уровне приложения форм через переопределения OnStart, OnSleep и OnResume.

public partial class App : Application
{
    ~~~~

    protected override void OnStart()
    {
        Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;
    }

    protected override void OnSleep()
    {
        Connectivity.ConnectivityChanged -= Connectivity_ConnectivityChanged;
    }

    protected override void OnResume()
    {
        Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;
    }

    void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
    {
        Page page;
        if (MainPage is NavigationPage)
        {
            page = ((NavigationPage)MainPage).CurrentPage;
        }
        else
        {
            page = MainPage;
        }
        page.DisplayAlert("Status", e.NetworkAccess.ToString(), "OK");
    }

}

Спасибо за ответ на последний вопрос: что, если вместо отображения предупреждения я хочу выполнить public async void FirstSyncUser (строковый хост, строковая база данных, строковый контакт) с целью проверки изменений в Интернете, чтобы я мог синхронизировать две базы данных

loot verge 03.10.2018 03:20

См. Обновленный вопрос выше, как я могу выполнить это вместо отображения предупреждения?

loot verge 03.10.2018 03:21

@lootverge Просто вызовите FirstSyncUser вместо вызова DisplayAlert, передав соответствующие параметры

SushiHangover 03.10.2018 03:25

Куда мне вызвать FirstSyncUser? iniside void Connectivity_ConnectivityChanged (отправитель объекта, ConnectivityChangedEventArgs e)?

loot verge 03.10.2018 03:30

@lootverge да, при условии, что вы хотите сначала проверить, что e.NetworkAccess равен Интернету .. if (e.NetworkAccess == NetworkAccess.Internet) { ... }

SushiHangover 03.10.2018 03:32

Я получаю сообщение об ошибке System.TypeLoadException: не удалось разрешить тип с помощью токена 01000004 (из typeref, класс / сборка Xamarin.Essentials.ConnectivityChangedEventArgs, Xamarin.Essentials, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null)

loot verge 03.10.2018 03:55

@lootverge Добавлен ли Xamarin.Essentials в каждый из ваших проектов приложений?

SushiHangover 03.10.2018 03:56

Не все добавлю

loot verge 03.10.2018 03:58

Я добавил, что все еще есть ошибка System.TypeLoadException: не удалось разрешить тип с токеном 01000005 (из typeref, класс / сборка Xamarin.Essentials.ConnectivityChangedEventArgs, Xamarin.Essentials, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null )

loot verge 03.10.2018 04:01

@sushuHangover, как я могу это исправить?

loot verge 03.10.2018 04:59

Другие вопросы по теме