Asynctask vs Thread ใน Android


137

ใน UI เพื่อทำงานเบื้องหลังบางอย่างฉันใช้ไฟล์Thread. แต่ตามที่คนอื่นแนะนำตอนนี้ฉันใช้AsyncTask.

อะไรคือความแตกต่างหลักระหว่าง a Threadและ an AsyncTask?

ในสถานการณ์ใดฉันควรใช้ a ThreadหรือAsyncTask?



@ webaldo.at ฉันตอบสิ่งนี้พวกเขาให้ป้อนคำอธิบายและความแตกต่างระหว่าง Asynctask และ Thread ฉันต้องการทราบว่ากรณีใดเช่นการเชื่อมต่อเครือข่ายไฟล์อ่านว่าฉันใช้อะไร?
ราม

ย่อ: เธรด -> ไม่สามารถเข้าถึง UI-Thread || Asynctask -> การเข้าถึง UI-Thread แบบมีเงื่อนไข
JavaDM

สำหรับงานเบื้องหลัง IntentService เป็นอีกตัวเลือกที่ดี
Chen

คำตอบ:


148

สำหรับงานที่ต้องใช้ CPU เป็นเวลานานโดยทั่วไปมีสองวิธีในการดำเนินการ: เธรด Java และ AsyncTask ดั้งเดิมของ Android

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

ใช้ AsyncTask สำหรับ:

  1. การใช้งานเครือข่ายที่เรียบง่ายซึ่งไม่ต้องดาวน์โหลดข้อมูลจำนวนมาก
  2. งานที่ผูกกับดิสก์ซึ่งอาจใช้เวลามากกว่าสองสามมิลลิวินาที

ใช้เธรด Java สำหรับ:

  1. การทำงานของเครือข่ายที่เกี่ยวข้องกับข้อมูลในระดับปานกลางถึงมาก (ทั้งการอัปโหลดหรือดาวน์โหลด)
  2. งานที่มี CPU สูงซึ่งต้องทำงานอยู่เบื้องหลัง
  3. งานใด ๆ ที่คุณต้องการควบคุมการใช้งาน CPU ที่สัมพันธ์กับเธรด GUI

และมีแหล่งข้อมูลดีๆมากมายทางอินเทอร์เน็ตซึ่งอาจช่วยคุณได้:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


ฉันขอถามได้ไหมว่าทำไมจำนวนข้อมูลการดาวน์โหลดจึงเป็นปัญหา
Yeung

1
@Yeung ดูเหมือนว่าคุณต้องการข้อมูลเชิงลึกเกี่ยวกับ Async Task! ดูปริมาณข้อมูลที่มากขึ้นจากนั้นเวลาที่ใช้ในการดำเนินการเดียวกันให้เสร็จสมบูรณ์ ดังนั้นจึงไม่ใช่แนวทางปฏิบัติที่ดีที่จะทำกระบวนการทำงานที่ยาวนานโดยใช้ Async Task เนื่องจากสาเหตุต่อไปนี้: 1. Async Task เชื่อมโยงกับวงจรชีวิตของกิจกรรมไม่ดี 2. พวกเขาสร้างการรั่วไหลของ meomory
Mohit

3
ดูได้ที่: stackoverflow.com/questions/12797550/…
Mohit

ขอบคุณ. ตอนนี้ฉันเข้าใจความเสี่ยงแล้ว
Yeung

@Impasse @Yeung ปริมาณข้อมูล IMO ไม่ใช่ปัญหาปัญหาสำคัญเกี่ยวกับการทำงานของเครือข่ายเวลาดำเนินการ แม้แต่การดาวน์โหลดเพียงไม่กี่ไบต์อาจใช้เวลานานเมื่อเซิร์ฟเวอร์ไม่ว่างไม่สามารถเข้าถึงได้ (หมดเวลา) เป็นต้นการแก้ไขอาจใช้AsyncTaskกับตัวกำหนดตารางเวลาของตัวเอง
xmedeko

44

หากคุณใช้เธรด Java คุณต้องจัดการกับข้อกำหนดต่อไปนี้ในโค้ดของคุณเอง:

การซิงโครไนซ์กับเธรดหลักหากคุณโพสต์ผลลัพธ์กลับไปที่อินเทอร์เฟซผู้ใช้

ไม่มีค่าเริ่มต้นสำหรับการยกเลิกเธรด

ไม่มีการรวมเธรดเริ่มต้น

ไม่มีค่าเริ่มต้นสำหรับการจัดการการเปลี่ยนแปลงการกำหนดค่าใน Android


3
นี่เป็นเรื่องที่อธิบายได้ชัดเจนกว่าเพราะมันมีเหตุผลว่าทำไมไม่ใช้เธรดธรรมดา ๆ จากใจของฉันสิ่งใดก็ตามที่ต้องเชื่อมโยงกับวงจรชีวิตของกิจกรรม / บริการควรใช้ AsyncTask แทนแม้ว่าคุณจะต้อง "ลดระดับทรัพยากร" ในงานด้วยตนเอง แต่อย่างน้อยคุณก็ไม่ต้องจบลงด้วยงานที่ค้างอยู่ เมื่อกิจกรรมถูกฆ่า
leRobot

28

เกลียว

  • งานที่ยาวนานโดยทั่วไป
  • เรียกใช้โดย thread.start () วิธีการ
  • ทริกเกอร์จากเธรดใด ๆ
  • รันบนเธรดของตัวเอง
  • การจัดการเธรด / รหัสด้วยตนเองอาจอ่านยาก

AsyncTask

  • งานเล็ก ๆ ที่ต้องสื่อสารกับเธรดหลัก
  • เรียกใช้โดยวิธี excute ()
  • ทริกเกอร์จากเธรดหลัก
  • รันบนเธรดของผู้ปฏิบัติงาน
  • ต้องดำเนินการและสร้างจากเธรดหลัก

ฉันไม่เข้าใจRuns on its own threadvs Runs on worker thread? เธรดของตัวเองและเธรดของผู้ปฏิบัติงานแตกต่างกันอย่างไร
imany apk

11

เกลียว

เธรดคือหน่วยของการดำเนินการพร้อมกัน มี call stack ของตัวเอง มีสองวิธีในการใช้เธรดในแอปพลิเคชัน

หนึ่งคือการจัดเตรียมคลาสใหม่ที่ขยายเธรดและแทนที่เมธอด run () อีกอันกำลังจัดเตรียมอินสแตนซ์ Thread ใหม่พร้อมกับอ็อบเจ็กต์ Runnable ระหว่างการสร้าง เธรดสามารถดำเนินการได้โดยเรียกเมธอด "start" คุณสามารถตั้งค่า "Priority" ของเธรดได้โดยเรียกเมธอด "setPriority (int)"

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

ตัวจัดการช่วยให้คุณสามารถส่งและประมวลผลข้อความและอ็อบเจ็กต์ที่รันได้ที่เชื่อมโยงกับ MessageQueue ของเธรด แต่ละเธรดมีคิวข้อความแต่ละรายการ (เหมือนรายการสิ่งที่ต้องทำ) และเธรดจะนำแต่ละข้อความไปประมวลผลจนกว่าคิวข้อความจะว่างเปล่า ดังนั้นเมื่อ Handler สื่อสารมันก็แค่ส่งข้อความไปยังเธรดผู้โทรและมันจะรอประมวลผล

หากคุณใช้เธรด Java คุณจะต้องจัดการกับข้อกำหนดต่อไปนี้ในโค้ดของคุณเอง:

การซิงโครไนซ์กับเธรดหลักหากคุณโพสต์ผลลัพธ์กลับไปยังอินเทอร์เฟซผู้ใช้ไม่มีค่าเริ่มต้นสำหรับการยกเลิกเธรดไม่มีการรวมเธรดเริ่มต้นไม่มีค่าเริ่มต้นสำหรับการจัดการการเปลี่ยนแปลงการกำหนดค่าใน Android

AsyncTask

AsyncTask ช่วยให้ใช้เธรด UI ได้อย่างเหมาะสมและง่ายดาย คลาสนี้อนุญาตให้ดำเนินการทำงานเบื้องหลังและเผยแพร่ผลลัพธ์บนเธรด UI โดยไม่ต้องจัดการเธรดและ / หรือตัวจัดการ งานอะซิงโครนัสถูกกำหนดโดยการคำนวณที่รันบนเธรดพื้นหลังและผลลัพธ์ถูกเผยแพร่บนเธรด UI

AsyncTask จะผ่าน 4 ขั้นตอนต่อไปนี้:

onPreExecute ()

เรียกใช้เธรด UI ก่อนที่งานจะดำเนินการ

doInbackground (Params .. )

เรียกใช้บนเธรดพื้นหลังทันทีหลังจากที่ onPreExecute () เสร็จสิ้นการดำเนินการ

onProgressUpdate (ความคืบหน้า .. )

เรียกใช้เธรด UI หลังจากเรียกเพื่อเผยแพร่Progress (ความคืบหน้า ... )

onPostExecute (ผลลัพธ์)

เรียกใช้บนเธรด UI หลังจากเสร็จสิ้นการคำนวณพื้นหลัง

ทำไมคุณจึงควรใช้ AsyncTask

ใช้งานง่ายสำหรับเธรด UI (ดังนั้นให้ใช้เมื่อเธรดผู้โทรเป็นเธรด UI)

ไม่จำเป็นต้องจัดการตัวจัดการ

ดูข้อมูลเพิ่มเติมได้ที่นี่


2

เกลียว:

Threadควรใช้เพื่อแยกการดำเนินการที่รันเป็นเวลานานจากเธรดหลักเพื่อให้ประสิทธิภาพดีขึ้น แต่ไม่สามารถยกเลิกได้อย่างหรูหราและไม่สามารถจัดการกับการเปลี่ยนแปลงการกำหนดค่าของ Android ได้ คุณไม่สามารถปรับปรุง UI Threadจาก

AsyncTaskสามารถใช้เพื่อจัดการกับรายการงานที่มีระยะเวลาสั้นกว่า 5 มิลลิวินาที ด้วยAsyncTaskคุณสามารถปรับปรุง UI Threadซึ่งแตกต่างจากภาษาจาวา แต่งานที่ต้องใช้เวลานานจำนวนมากจะทำให้ประสิทธิภาพการทำงานแย่ลง

คุณมีทางเลือกอื่น ๆ อีกสองสามทางสำหรับทั้งคู่

HandlerThread / HandlerและThreadPoolExecutor

อ้างถึงโพสต์ด้านล่างสำหรับรายละเอียดเพิ่มเติม:

ตัวจัดการเทียบกับ AsyncTask กับเธรด

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