Android API สำหรับตรรกะอะซิงโครนัส AsyncTask กำลังจะหมดลง ตามความมุ่งมั่นของ AOSP API จะเลิกใช้งานใน Android 11
เป็นเวลาหลายปีแล้วที่ AsyncTask ของ Android เป็นเครื่องมือหลักสำหรับนักพัฒนามือใหม่และผู้เชี่ยวชาญ หากคุณเคยใช้ Googled บทช่วยสอนสำหรับตรรกะอะซิงโครนัสทุกประเภทใน Android มีโอกาสที่ผลลัพธ์สองสามรายการแรกจะแนะนำให้ใช้ AsyncTask ไม่ใช่ว่านี่เป็นทางเลือกแบบสุ่มเช่นกัน เดิมที AsyncTask ถูกสร้างขึ้นเพื่อลดความซับซ้อนของการโต้ตอบระหว่างการดำเนินการในเบื้องหลังและ UI ของแอปพลิเคชัน สักพักมันก็ทำได้ดี AsyncTask ช่วยลดความซับซ้อนของงานอะซิงโครนัสได้จริงๆ แต่นั่นไม่ได้หมายความว่ามันสมบูรณ์แบบ
สิ่งหนึ่งที่แอปพลิเคชันจำนวนมากต้องทำคือดึงข้อมูลจากเซิร์ฟเวอร์ระยะไกล เนื่องจากคำขอเครือข่ายอาจใช้เวลาสักครู่ โดยปกติแล้วจะต้องดำเนินการแบบอะซิงโครนัสเพื่อไม่ให้แอปพลิเคชันค้าง เมื่อการดำเนินการเสร็จสิ้น ก็สามารถอัปเดต UI ได้ อย่างไรก็ตาม อาจเป็นไปได้ว่าเมื่อคำขอเครือข่ายเสร็จสมบูรณ์ ส่วนที่เกี่ยวข้องของ UI จะไม่มีอยู่แล้ว ซึ่งอาจทำให้เกิดข้อขัดข้องหรือข้อบกพร่องอื่นๆ ได้ แม้ว่า AsyncTask จะทำให้กระบวนการโดยรวมง่ายขึ้น แต่ก็ไม่คำนึงถึงวงจรการใช้งานของแอปพลิเคชัน Android นั่นหมายความว่าไม่มีการป้องกันในตัวต่อ AsyncTask ที่เสร็จสิ้นหลังจากการเปลี่ยนแปลง UI แน่นอนว่า คุณสามารถเพิ่มการตรวจสอบและการป้องกันอื่นๆ ด้วยตนเองได้ แต่นั่นเป็นการเพิ่มโค้ดซ้ำจำนวนมาก (AKA boilerplate) เนื่องจากปัญหาเช่นนี้ AsyncTask จึงล้มลงข้างทาง Google ยังไม่ได้ทำการเปลี่ยนแปลงวิธีการทำงานมากนัก
ดูเหมือนว่าความคิดเห็นของ Google ก็คือ AsyncTask นั้นเกินกว่าจะประหยัดได้ ในคอมมิต AOSP ล่าสุด AsyncTask เลิกใช้แล้ว โดยอ้างถึงเหตุผลที่คล้ายกันกับเหตุผลที่ฉันเพิ่งพูดถึง แม้ว่านี่จะไม่ใช่การเปลี่ยนแปลงครั้งใหญ่สำหรับผู้ใช้ปลายทาง แต่ก็อาจมีความหมายอย่างมากสำหรับนักพัฒนา หากคุณยังคงใช้โค้ดเบสรุ่นเก่าอยู่หรือคุณเพิ่งเริ่มต้นใช้งานแบบอะซิงโครนัสใน Android คุณอาจต้องเปลี่ยนโค้ดจำนวนมาก โชคดีที่ Google ไม่ได้ปล่อยให้นักพัฒนาตกอยู่ในฝุ่น
เนื่องจากข้อจำกัดของ AsyncTask ทางเลือกอื่นจึงผุดขึ้นเมื่อเวลาผ่านไป เช่น RxJava และไลบรารี Coroutines ใหม่ของ Kotlin ทางเลือกเหล่านี้มีแนวโน้มที่จะมีความยืดหยุ่นและฟีเจอร์มากกว่า AsyncTask มาก ดังนั้นจึงได้รับความนิยมไม่น้อย ในประกาศเลิกใช้งานสำหรับ AsyncTask Google ขอแนะนำให้ใช้เฟรมเวิร์ก Concurrency ของ Java หรือ Kotlin Coroutines
โดยส่วนตัวแล้ว ฉันเริ่มใช้ Coroutines ของ Kotlin แล้ว และไม่ได้มองย้อนกลับไปอีก แน่นอนว่า ฉันรู้ว่ามีคนจำนวนมากรวมโค้ดของตนเข้ากับ AsyncTask อย่างแน่นหนา ดังนั้น อย่างน้อยนี่ก็น่าจะทำให้พวกเขาไม่สะดวกเล็กน้อย เป็นเรื่องดีที่มีทางเลือกให้เลือกมากมาย การเปลี่ยนรหัสของคุณอาจสร้างความรำคาญ แต่อย่างน้อยก็สามารถทำได้ในครั้งนี้
หากคุณต้องการรายละเอียดเพิ่มเติม คุณสามารถตรวจสอบการคอมมิตได้ ที่นี่. ข้อตกลงดังกล่าวได้รวมเข้าด้วยกันแล้วในวันนี้ และหากไม่มีการเปิดตัวการบำรุงรักษา Android อยู่ในขั้นตอน เราจะเห็นการเปลี่ยนแปลงนี้ใน Android 11 ในปีหน้า