В настоящее время я использую 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);
}
}
@SushiHangover, можешь мне показать?
@SushiHangover, можешь показать мне, как и где мне это поставить? Чтобы использовать его во всем мире





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 (строковый хост, строковая база данных, строковый контакт) с целью проверки изменений в Интернете, чтобы я мог синхронизировать две базы данных
См. Обновленный вопрос выше, как я могу выполнить это вместо отображения предупреждения?
@lootverge Просто вызовите FirstSyncUser вместо вызова DisplayAlert, передав соответствующие параметры
Куда мне вызвать FirstSyncUser? iniside void Connectivity_ConnectivityChanged (отправитель объекта, ConnectivityChangedEventArgs e)?
@lootverge да, при условии, что вы хотите сначала проверить, что e.NetworkAccess равен Интернету .. if (e.NetworkAccess == NetworkAccess.Internet) { ... }
Я получаю сообщение об ошибке System.TypeLoadException: не удалось разрешить тип с помощью токена 01000004 (из typeref, класс / сборка Xamarin.Essentials.ConnectivityChangedEventArgs, Xamarin.Essentials, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null)
@lootverge Добавлен ли Xamarin.Essentials в каждый из ваших проектов приложений?
Не все добавлю
Я добавил, что все еще есть ошибка System.TypeLoadException: не удалось разрешить тип с токеном 01000005 (из typeref, класс / сборка Xamarin.Essentials.ConnectivityChangedEventArgs, Xamarin.Essentials, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null )
@sushuHangover, как я могу это исправить?
Он использует его глобально, настраивая обработчик на уровне приложения (lication). В противном случае добавьте / удалите обработчик в событиях жизненного цикла страницы (чтобы избежать дублирования, определите подкласс страницы с этими событиями, а затем используйте этот подкласс в качестве подкласса для всех остальных страниц).