AsyncTaskLoader กับ AsyncTask


129

ตั้งแต่Honeycombและมันเป็นไปได้ที่จะใช้งานv4 Compatibility Library AsyncTaskLoaderจากสิ่งที่ฉันเข้าใจAsyncTaskLoaderสามารถอยู่รอดผ่านการเปลี่ยนแปลงการกำหนดค่าเช่นการพลิกหน้าจอ

แนะนำให้ใช้AsyncTaskLoaderแทนAsyncTask? ไม่LoaderManagerได้รับในภาพเกินไป?

แต่ฉันไม่พบตัวอย่างที่ดีเกี่ยวกับวิธีใช้ไฟล์AsyncTaskLoader. เอกสารยังไม่มีตัวอย่าง ใครช่วยให้ตัวอย่างที่ดี

คำตอบ:


51

คุณสามารถดูซอร์สโค้ดของไลบรารีความเข้ากันได้เพื่อรับข้อมูลเพิ่มเติม คืออะไรFragmentActivity:

  • เก็บรายชื่อของLoaderManager's
  • ตรวจสอบให้แน่ใจว่าจะไม่ถูกทำลายเมื่อคุณพลิกโทรศัพท์ (หรือเกิดการเปลี่ยนแปลงการกำหนดค่าอื่น ๆ ) โดยบันทึกอินสแตนซ์โดยใช้ onRetainNonConfigurationInstance()
  • เตะตัวโหลดที่ถูกต้องเมื่อคุณโทรinitLoader()เข้าร่วมกิจกรรมของคุณ

คุณต้องใช้LoaderManagerอินเทอร์เฟซเพื่อเชื่อมต่อกับรถตักและจัดเตรียมการเรียกกลับที่จำเป็นเพื่อสร้างตัวโหลดของคุณและเติมข้อมูลมุมมองของคุณด้วยข้อมูลที่ส่งคืน

โดยทั่วไปแล้วควรจะง่ายกว่าการจัดการAsyncTaskด้วยตัวเอง อย่างไรก็ตามAsyncTaskLoaderไม่ได้จัดทำเอกสารไว้อย่างดีดังนั้นคุณควรศึกษาตัวอย่างในเอกสารและ / หรือสร้างโมเดลโค้ดของคุณหลังจากCursorLoaderนั้น


5
ฉันจะดูสิ่งนี้ อาจจะยังเร็วเกินไปที่จะหาตัวอย่างที่ดีAsyncTaskLoaderและเมื่อนักพัฒนาเริ่มใช้งานมากขึ้นก็จะมีตัวอย่างมากขึ้น
OKA

47

เมื่อเปรียบเทียบAsyncTaskLoaderกับAsyncTaskดังที่คุณอาจทราบเมื่อคุณหมุนหน้าจออุปกรณ์อาจทำลายและสร้างกิจกรรมของคุณขึ้นมาใหม่เพื่อให้เกิดความชัดเจนให้รูปภาพหมุนอุปกรณ์ของคุณในขณะที่ธุรกรรมเครือข่ายกำลังดำเนินอยู่:

AsyncTaskจะถูกเรียกใช้งานอีกครั้งเป็นเธรดพื้นหลังอีกครั้งและการประมวลผลเธรดพื้นหลังก่อนหน้านี้มีความซ้ำซ้อนและเป็นซอมบี้

AsyncTaskLoaderจะถูกนำมาใช้ซ้ำโดยใช้ Loader ID ที่ลงทะเบียนไว้ใน Loader Manager ก่อนหน้านี้ดังนั้นอย่าทำธุรกรรมเครือข่ายซ้ำ

โดยสรุป AsyncTaskLoaderป้องกันการซ้ำซ้อนของเธรดพื้นหลังและกำจัดกิจกรรมซอมบี้ซ้ำซ้อน


11

AsyncTaskLoaderทำหน้าที่เหมือนกับAsyncTaskแต่ดีกว่าเล็กน้อย สามารถจัดการการเปลี่ยนแปลงการกำหนดค่ากิจกรรมได้ง่ายขึ้นและทำงานภายในวงจรชีวิตของ Fragments และ Activities สิ่งที่ดีคือ AsyncTaskLoader สามารถใช้ได้ในทุกสถานการณ์ที่ใช้ AsyncTask เมื่อใดก็ตามที่จำเป็นต้องโหลดข้อมูลลงในหน่วยความจำเพื่อให้ Activity / Fragment จัดการ AsyncTaskLoader สามารถทำงานได้ดีขึ้น

มีปัญหาเล็กน้อยในการใช้ AsyncTasks แม้ว่า:

  • การเปลี่ยนแปลงการกำหนดค่าอาจทำให้สิ่งต่างๆยุ่งเหยิงได้
  • การหยุดกิจกรรมชั่วคราวไม่ได้หยุด AsyncTask ชั่วคราว
  • รหัสสำเร็จรูปจำนวนพอสมควร (ซึ่งหมายถึงข้อผิดพลาดที่เป็นไปได้มากขึ้น)

เอกสาร AsyncTaskLoader


8

ความแตกต่างบางประการนอกเหนือจากที่อธิบายไว้ในคำตอบอื่น ๆ :

เมื่อใช้AsyncTaskLoaderผ่านAsyncTask :

  • AsyncTaskLoaderให้เรามีอิสระในการโหลดข้อมูลแคชเก่าจนกว่าข้อมูลใหม่จะถูกส่งคืนโดยforceLoad()

  • เราสามารถตั้งค่าความล่าช้าเป็นAsyncTaskLoaderโดยsetUpdateThrottle()ที่สามารถป้องกันการอัปเดตไคลเอ็นต์ต่อเนื่อง (Activity / Fragment)

  • AsyncTaskLoaderสามารถแชร์ไปยังส่วนต่างๆได้หากมีกิจกรรมหลักร่วมกันและเริ่มต้นจากgetActivity().getSupportLoaderManager()

  • AsyncTaskLoaderถูกทำลายLoaderMangerเมื่อไม่มีกิจกรรมที่เชื่อมโยงอีกต่อไป ในขณะที่เราต้องทำลายAsyncTasksด้วยตนเองหากกิจกรรมของผู้โทรถูกทำลาย ซึ่งจะช่วยประหยัดเวลาของเราในการเขียนข้อมูลที่เคลียร์ทั้งหมด AsyncTaskLoader เล่นได้ดีกับวงจรชีวิตตามลำดับ

ดังนั้น AsyncTaskLoader จึงดีกว่า AsyncTask

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.