ใน UI เพื่อทำงานเบื้องหลังบางอย่างฉันใช้ไฟล์Thread
. แต่ตามที่คนอื่นแนะนำตอนนี้ฉันใช้AsyncTask
.
อะไรคือความแตกต่างหลักระหว่าง a Thread
และ an AsyncTask
?
ในสถานการณ์ใดฉันควรใช้ a Thread
หรือAsyncTask
?
ใน UI เพื่อทำงานเบื้องหลังบางอย่างฉันใช้ไฟล์Thread
. แต่ตามที่คนอื่นแนะนำตอนนี้ฉันใช้AsyncTask
.
อะไรคือความแตกต่างหลักระหว่าง a Thread
และ an AsyncTask
?
ในสถานการณ์ใดฉันควรใช้ a Thread
หรือAsyncTask
?
คำตอบ:
สำหรับงานที่ต้องใช้ CPU เป็นเวลานานโดยทั่วไปมีสองวิธีในการดำเนินการ: เธรด Java และ AsyncTask ดั้งเดิมของ Android
ไม่มีใครจำเป็นต้องดีไปกว่ากัน แต่การรู้ว่าเมื่อใดควรใช้การโทรแต่ละครั้งเป็นสิ่งสำคัญในการใช้ประโยชน์จากประสิทธิภาพของระบบเพื่อประโยชน์ของคุณ
ใช้ AsyncTask สำหรับ:
ใช้เธรด Java สำหรับ:
และมีแหล่งข้อมูลดีๆมากมายทางอินเทอร์เน็ตซึ่งอาจช่วยคุณได้:
http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
AsyncTask
กับตัวกำหนดตารางเวลาของตัวเอง
หากคุณใช้เธรด Java คุณต้องจัดการกับข้อกำหนดต่อไปนี้ในโค้ดของคุณเอง:
การซิงโครไนซ์กับเธรดหลักหากคุณโพสต์ผลลัพธ์กลับไปที่อินเทอร์เฟซผู้ใช้
ไม่มีค่าเริ่มต้นสำหรับการยกเลิกเธรด
ไม่มีการรวมเธรดเริ่มต้น
ไม่มีค่าเริ่มต้นสำหรับการจัดการการเปลี่ยนแปลงการกำหนดค่าใน Android
เกลียว
AsyncTask
Runs on its own thread
vs Runs on worker thread
? เธรดของตัวเองและเธรดของผู้ปฏิบัติงานแตกต่างกันอย่างไร
เกลียว
เธรดคือหน่วยของการดำเนินการพร้อมกัน มี 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)
ไม่จำเป็นต้องจัดการตัวจัดการ
ดูข้อมูลเพิ่มเติมได้ที่นี่
เกลียว:
Thread
ควรใช้เพื่อแยกการดำเนินการที่รันเป็นเวลานานจากเธรดหลักเพื่อให้ประสิทธิภาพดีขึ้น แต่ไม่สามารถยกเลิกได้อย่างหรูหราและไม่สามารถจัดการกับการเปลี่ยนแปลงการกำหนดค่าของ Android ได้ คุณไม่สามารถปรับปรุง UI Thread
จาก
AsyncTask
สามารถใช้เพื่อจัดการกับรายการงานที่มีระยะเวลาสั้นกว่า 5 มิลลิวินาที ด้วยAsyncTask
คุณสามารถปรับปรุง UI Thread
ซึ่งแตกต่างจากภาษาจาวา แต่งานที่ต้องใช้เวลานานจำนวนมากจะทำให้ประสิทธิภาพการทำงานแย่ลง
คุณมีทางเลือกอื่น ๆ อีกสองสามทางสำหรับทั้งคู่
HandlerThread / HandlerและThreadPoolExecutor
อ้างถึงโพสต์ด้านล่างสำหรับรายละเอียดเพิ่มเติม: