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" มันจะไม่ถูกเรียกเมื่อฉันปิด Wifi

มีความคิดอะไรบ้าง?

ขอแสดงความนับถือแมตต์


person Matt    schedule 12.10.2013    source แหล่งที่มา


คำตอบ (3)


โอเค ฉันควรจะหาคำตอบด้วยตัวเองจริงๆ

คุณควรเรียกใช้ฟังก์ชันต่อไปนี้ก่อนจึงจะได้รับแจ้ง:

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

การเรียกฟังก์ชันคงที่ 3 รายการนี้จะเริ่มต้นวัตถุที่จำเป็นทั้งหมด ออบเจ็กต์ทั้ง 3 รายการจะได้รับการแจ้งเตือนเมื่อมีการเปลี่ยนแปลงและเรียก "OnChange" ในการเรียกการเข้าถึง (ซึ่งจะแจ้งตัวจัดการเหตุการณ์ของคุณ)

(แน่นอนว่าที่ดียิ่งกว่านั้นคือการสร้างฟังก์ชั่นพิเศษที่เริ่มต้นออบเจ็กต์ที่จำเป็นทั้งหมดเพื่อที่คุณจะได้ไม่ต้องเรียกใช้ฟังก์ชั่นทั้ง 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 ดังนั้นจึงจะไม่ทริกเกอร์เหตุการณ์ด้วย ฉันกำลังทดสอบบนเครื่องจำลองโดยปิด Wifi ของแล็ปท็อปของฉัน และบนอุปกรณ์โดยเปิดแอป ไปที่การตั้งค่าเพื่อปิด Wifi และกลับไปที่แอป ฉันไม่แน่ใจว่าสถานการณ์การทดสอบของฉันดีหรือไม่ - 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 Good ที่คุณพบวิธีแก้ไขแล้ว และฉันควรหยุดโพสต์คำตอบขณะทำอาหารเพื่อไม่ให้สับสนน้อยลง;) - 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