Monotouch — получение уведомлений при изменении состояния сети

Я знаком с классом «достижимость», чтобы проверить, есть ли подключение к Интернету: https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs

Теперь мне было интересно, есть ли способ получать уведомления, когда статус сети изменился? Допустим, моя коллекция загружается, когда нет интернета. Изображения не загружаются. Я хотел бы снова запустить загрузку, если iPad снова подключится к Интернету.

В классе достижимости я вижу следующий код:

public static event EventHandler ReachabilityChanged;

    static void OnChange (NetworkReachabilityFlags flags)
    {
        var h = ReachabilityChanged;
        if (h != null)
            h (null, EventArgs.Empty);
    }

Однако, если я устанавливаю точку останова в методе «OnChange», она не вызывается, когда я выключаю Wi-Fi.

Любые идеи?

С уважением, Мэтт


person Matt    schedule 12.10.2013    source источник


Ответы (3)


Хорошо, я должен был найти ответ сам на самом деле.

Вы должны сначала вызвать следующие функции, прежде чем вы получите уведомление:

Reachability.InternetConnectionStatus (); 
Reachability.LocalWifiConnectionStatus ();
Reachability.RemoteHostStatus ();

Вызов этих трех вызовов статических функций инициализирует все необходимые объекты. Эти 3 объекта получат уведомление об изменении и вызовут «OnChange» в вызове Reachability (который уведомляет ваш обработчик событий).

(конечно, еще лучше создать специальную функцию, которая инициализирует все необходимые объекты, поэтому вам не нужно вызывать эти 3 функции, поскольку они уже будут проверять сетевое соединение)

person Matt    schedule 12.10.2013

Вы должны иметь возможность просто добавить обработчик события к событию ReachabilityChanged, что-то вроде (не скомпилированный тест);

Reachability.ReachabilityChanged += c_ReachabilityChanged;

static void c_ReachabilityChanged(object sender, EventArgs e)
{
    Console.WriteLine("Here I can handle that network reachability changed.");
}
person Joachim Isaksson    schedule 12.10.2013
comment
Я знаю, как добавить обработчик событий, но точка останова никогда не вызывается в OnChange, поэтому она также не будет запускать события. Я тестирую его на симуляторе, отключив Wi-Fi на моем ноутбуке и на устройстве, запустив приложение, перейдя в настройки, чтобы отключить Wi-Fi, и вернувшись в приложение. Я не уверен, хорош ли мой тестовый сценарий. - person Matt; 12.10.2013
comment
@Matt Извините, возможно, я неправильно понял, о чем вы спрашивали, и отключение ноутбука должно работать для тестирования. Если этот класс вам не подходит, вы можете зарегистрируйте широковещательный приемник для мониторинга состояния сети. - person Joachim Isaksson; 12.10.2013
comment
Не удивлен, что вы неправильно поняли это, потому что мои слова были немного запутанными (я изменил их) относительно События. Предоставленная вами ссылка предназначена для Android (monodroid), а не для iOS (monotouch). Я все равно добавил вашу ссылку в закладки, потому что я могу использовать ее, если когда-нибудь перенесу свое приложение на Android :-) - person Matt; 12.10.2013
comment
@Matt Хорошо, что вы нашли решение, и я должен перестать публиковать ответы во время готовки, чтобы не запутаться;) - person Joachim Isaksson; 13.10.2013

Просто вызов этого сработает, его можно написать в AppDelegate

Reachability.RemoteHostStatus ();

Reachability.ReachabilityChanged += ReachabilityChanged;

static void ReachabilityChanged(object sender, EventArgs e){//Do Something};
person Maddiee    schedule 13.07.2019