ฉันสับสนว่าเมื่อใดจะเลือก AsyncTask มากกว่าตัวจัดการ บอกว่าฉันมีรหัสฉันต้องการเรียกใช้ทุก n วินาทีซึ่งจะปรับปรุง UI ทำไมฉันถึงเลือกอันหนึ่งมากกว่าอีกอัน?
ฉันสับสนว่าเมื่อใดจะเลือก AsyncTask มากกว่าตัวจัดการ บอกว่าฉันมีรหัสฉันต้องการเรียกใช้ทุก n วินาทีซึ่งจะปรับปรุง UI ทำไมฉันถึงเลือกอันหนึ่งมากกว่าอีกอัน?
คำตอบ:
IMO, AsyncTask ถูกเขียนขึ้นเพื่อให้วิธีที่สะดวกและง่ายต่อการใช้งานเพื่อให้การประมวลผลพื้นหลังในแอพ Android โดยไม่ต้องกังวลเกี่ยวกับรายละเอียดในระดับต่ำมากเกินไป (เธรดลูปข้อความ ฯลฯ ) มันมีวิธีการโทรกลับที่ช่วยในการกำหนดเวลางานและยังปรับปรุง UI ได้อย่างง่ายดายเมื่อจำเป็น
อย่างไรก็ตามมันเป็นสิ่งสำคัญที่จะต้องทราบว่าเมื่อใช้ AsyncTask นักพัฒนากำลังส่งข้อ จำกัด ของมันซึ่งเป็นผลมาจากการตัดสินใจออกแบบที่ผู้เขียนของชั้นใช้ ยกตัวอย่างเช่นเมื่อเร็ว ๆ นี้ฉันพบว่ามีการ จำกัด จำนวนงานที่สามารถกำหนดเวลาโดยใช้ AsyncTasks
ตัวจัดการมีความโปร่งใสของทั้งสองและอาจช่วยให้คุณมีอิสระมากขึ้น ดังนั้นหากคุณต้องการควบคุมสิ่งต่างๆมากขึ้นคุณจะต้องเลือก Handler ไม่เช่นนั้น AsynTask ก็ใช้ได้ดี
AsyncTasksจะถูกรันบนเธรดเดียวดังนั้นจึงไม่มีการขนานกันอีกต่อไป คุณยังคงสามารถเรียกใช้พวกเขาในการExecutorดำเนินการparalel
กฎง่ายๆของฉันคือ:
ถ้าคุณกำลังทำบางสิ่งบางอย่างโดดเดี่ยวที่เกี่ยวข้องกับ UI AsyncTaskเช่นการดาวน์โหลดข้อมูลที่จะนำเสนอในรายการไปข้างหน้าและการใช้งาน
ถ้าคุณกำลังทำหลายงานซ้ำเช่นการดาวน์โหลดภาพหลายภาพที่จะแสดงในImageViews(เช่นการดาวน์โหลดภาพขนาดเล็ก) Handlerเมื่อดาวน์โหลดใช้งานกับคิว
พยายามหลีกเลี่ยงการใช้ AsyncTask ทุกครั้งที่เป็นไปได้ด้วยเหตุผลดังต่อไปนี้:
AsyncTask ไม่รับประกันว่าจะเรียกใช้เนื่องจากมีฐาน ThreadPool และขนาดสูงสุดที่กำหนดโดยระบบและหากคุณสร้าง asynctask มากเกินไปในที่สุดพวกเขาก็จะถูกทำลายในที่สุด
AsyncTask สามารถยกเลิกได้โดยอัตโนมัติแม้ในขณะที่ใช้งานขึ้นอยู่กับวงจรชีวิตของกิจกรรมและคุณไม่สามารถควบคุมได้
วิธี AsyncTask ที่ทำงานบน UI Thread เช่น onPostExecute สามารถเรียกใช้งานได้เมื่อกิจกรรมที่อ้างถึงไม่ปรากฏให้เห็นอีกต่อไปหรืออาจอยู่ในสถานะเลย์เอาต์ต่าง ๆ เช่นหลังจากการวางแนว
สรุปได้ว่าคุณไม่ควรใช้วิธีเชื่อมโยง UIT ของ AsyncTask ซึ่งเป็นข้อได้เปรียบหลัก !!! นอกจากนี้คุณควรทำงานที่ไม่สำคัญกับ doInBackground เท่านั้น อ่านกระทู้นี้สำหรับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับปัญหานี้:
AsyncTask มีข้อบกพร่องทางแนวคิดจริงๆหรือฉันแค่ทำบางสิ่งหายไป?
เพื่อสรุปพยายามที่จะชอบใช้ IntentServices, HandlerThread หรือ ThreadPoolExecutor แทน AsyncTask เมื่อปัญหาที่อ้างถึงข้างต้นเป็นปัญหาสำหรับคุณ แน่นอนว่ามันจะต้องใช้งานมากกว่านี้ แต่ใบสมัครของคุณจะปลอดภัยกว่า
หากคุณต้องการทำการคำนวณทุก ๆ x วินาทีคุณควรกำหนดตารางเวลาRunnableด้วยHandler(พร้อมpostDelayed()) และRunnableควรเริ่มต้นในเธรด UI ปัจจุบัน หากคุณต้องการเริ่มในเธรดอื่นให้ใช้ HandlerThread AsyncTask ใช้งานง่ายกว่าสำหรับเรา แต่ไม่ดีไปกว่าตัวจัดการ
ตัวจัดการเกี่ยวข้องกับเธรดหลักของแอปพลิเคชัน มันจัดการและกำหนดเวลาข้อความและ runnables ส่งจากกระทู้พื้นหลังเพื่อเธรดหลักของแอ
AsyncTask มีวิธีการง่าย ๆ ในการจัดการเธรดพื้นหลังเพื่ออัปเดต UI โดยไม่ต้องปิดกั้นโดยการใช้เวลานาน
คำตอบคือทั้งสองสามารถใช้เพื่ออัปเดต UI จากเธรดพื้นหลังความแตกต่างจะอยู่ในสถานการณ์จำลองการทำงานของคุณ คุณอาจพิจารณาใช้ตัวจัดการมันคุณต้องการโพสต์ข้อความล่าช้าหรือส่งข้อความไปยัง MessageQueue ในการสั่งซื้อเฉพาะ
คุณอาจพิจารณาใช้ AsyncTask หากคุณต้องการแลกเปลี่ยนพารามิเตอร์ (เช่นการอัปเดต UI) ระหว่างเธรดหลักของแอปและเธรดพื้นหลังอย่างง่ายดาย
AsyncTaskทึกทักว่าคุณจะทำอะไรกับเธรด UI หลังจากงานพื้นหลังบางอย่างเสร็จสิ้น นอกจากนี้คุณสามารถเรียกใช้งานได้เพียงครั้งเดียว (หลังจากนี้สถานะของมันคือFINISHEDและคุณจะได้รับข้อยกเว้นในการพยายามเรียกใช้งานอีกครั้ง) อีกทั้งความยืดหยุ่นในการใช้งานก็ไม่มาก ใช่คุณสามารถใช้THREAD_POOL_EXECUTORสำหรับการดำเนินการแบบขนาน แต่ความพยายามอาจไม่คุ้มค่า
Handlerไม่เข้าใจอะไรเลยยกเว้นการจัดการ Runnables และข้อความ นอกจากนี้ก็สามารถทำงานได้หลายครั้งตามที่คุณต้องการ คุณมีอิสระในการตัดสินใจว่าจะต้องติดเธรดใดไว้อย่างไรมันสื่อสารกับตัวจัดการอื่น ๆHandlerThreadได้อย่างไร ดังนั้นจึงมีความยืดหยุ่นและเหมาะสำหรับงานซ้ำ ๆ
พวกเขาเป็นคำถามสัมภาษณ์ที่ดีที่สุดที่ถาม AsyncTask - พวกเขาจะใช้ในการ offload ของเธรด UI และทำงานในพื้นหลัง Handlers - Android dosent มีวิธีการสื่อสารโดยตรงระหว่าง UI และเธรดพื้นหลัง ตัวจัดการต้องใช้เพื่อส่งข้อความหรือเรียกใช้ผ่านคิวข้อความ
ดังนั้น AsyncTasks จึงถูกใช้เมื่อต้องการใช้งานในพื้นหลังและตัวจัดการใช้เพื่อการสื่อสารระหว่าง UI และเธรดพื้นหลัง
doInBackground - โดยทั่วไปแล้วจะทำงานในเธรดอื่น onPostExecute - โพสต์ผลลัพธ์บนเธรด UI และเป็นการส่งข้อความภายในไปยังตัวจัดการของเธรดหลัก เธรด UI หลักมีตัวเชื่อมโยงและตัวจัดการเกี่ยวข้องแล้ว
ดังนั้นโดยทั่วไปถ้าคุณต้องทำงานพื้นหลังให้ใช้ AsyncTask แต่ท้ายที่สุดถ้าสิ่งที่ต้องได้รับการอัพเดทบน UI มันจะใช้ตัวจัดการเธรดหลัก