หากเราดูซอร์สโค้ดเราจะเห็นAsyncTask
และHandler
เขียนเป็นภาษาจาวาอย่างแท้จริง (มีข้อยกเว้นอยู่บ้าง แต่นั่นไม่ใช่ประเด็นสำคัญ)
ดังนั้นจึงมีความมหัศจรรย์ในไม่มีหรือAsyncTask
Handler
คลาสเหล่านี้ทำให้ชีวิตของเราง่ายขึ้นในฐานะนักพัฒนา
ตัวอย่างเช่น: หากโปรแกรม A วิธีการโทร A () วิธี A () สามารถทำงานในเธรดอื่นด้วยโปรแกรม A เราสามารถตรวจสอบได้อย่างง่ายดายด้วยรหัสต่อไปนี้:
Thread t = Thread.currentThread();
int id = t.getId();
ทำไมเราควรใช้เธรดใหม่สำหรับงานบางอย่าง? คุณสามารถ google มัน ด้วยเหตุผลหลายประการเช่นยกงานหนักทำงานยาว
ดังนั้นสิ่งที่เป็นความแตกต่างระหว่างThread
, AsyncTask
และHandler
?
AsyncTask
และHandler
เขียนเป็นภาษาจาวา (ใช้ภายในThread
) ดังนั้นทุกสิ่งที่เราสามารถทำได้ด้วยHandler
หรือAsyncTask
เราก็สามารถใช้งานได้Thread
เช่นกัน
สิ่งที่สามารถHandler
และAsyncTask
จริงๆช่วย?
เหตุผลที่ชัดเจนที่สุดคือการสื่อสารระหว่างเธรดผู้โทรและเธรดผู้ทำงาน ( เธรดผู้โทร : เธรดที่เรียกเธรดของผู้ทำงานเพื่อทำงานบางอย่างเธรดการโทรไม่จำเป็นต้องเป็นเธรด UI) แน่นอนเราสามารถสื่อสารระหว่างสองเธรดในวิธีอื่น ๆ แต่มีข้อเสียมากมาย (และอันตราย) เนื่องจากความปลอดภัยของเธรด
นั่นคือเหตุผลที่เราควรใช้และHandler
AsyncTask
คลาสเหล่านี้ทำงานส่วนใหญ่ให้กับเราเราจำเป็นต้องรู้วิธีการที่จะแทนที่
ความแตกต่างระหว่างHandler
และAsyncTask
เป็น: ใช้AsyncTask
เมื่อด้าย Callerเป็นหัวข้อ UI นี่คือเอกสาร Android ที่บอกว่า:
AsyncTask ช่วยให้สามารถใช้เธรด UI ที่เหมาะสมและง่ายดาย คลาสนี้อนุญาตให้ดำเนินการพื้นหลังและเผยแพร่ผลลัพธ์บนเธรด UI โดยไม่ต้องจัดการกับเธรดและ / หรือตัวจัดการ
ฉันต้องการเน้นสองจุด:
1) การใช้เธรด UI อย่างง่ายดาย (ดังนั้นใช้เมื่อเธรดผู้โทรคือเธรด UI)
2) ไม่จำเป็นต้องจัดการกับตัวจัดการ (หมายถึง: คุณสามารถใช้ตัวจัดการแทน AsyncTask แต่ AsyncTask เป็นตัวเลือกที่ง่ายกว่า)
มีหลายสิ่งในโพสต์นี้ที่ฉันยังไม่ได้พูดเช่น: UI Thread คืออะไรหรือทำไมง่ายกว่า คุณต้องรู้วิธีการบางอย่างหลังแต่ละชั้นเรียนและใช้มันคุณจะเข้าใจเหตุผลอย่างสมบูรณ์
@: เมื่อคุณอ่านเอกสาร Android คุณจะเห็น:
ตัวจัดการช่วยให้คุณสามารถส่งและประมวลผลข้อความและวัตถุที่เรียกใช้ที่เชื่อมโยงกับ MessageQueue ของเธรด
คำอธิบายนี้อาจดูแปลกในตอนแรก เราต้องเข้าใจว่าแต่ละเธรดมีคิวข้อความแต่ละรายการ (เช่นรายการที่ต้องทำ) และเธรดจะใช้แต่ละข้อความและทำจนกว่าคิวข้อความจะว่างเปล่า (เหมือนกับที่เราทำงานให้เสร็จและเข้านอน) ดังนั้นเมื่อHandler
สื่อสารมันก็แค่ให้ข้อความไปยังผู้โทรด้ายและมันจะรอการประมวลผล
ซับซ้อน? เพียงจำไว้ว่าHandler
สามารถสื่อสารกับผู้โทรเข้าเธรดได้อย่างปลอดภัย