ข้อแตกต่างระหว่าง Service, Async Task & Thread หรือไม่?


147

อะไรคือความแตกต่างระหว่าง Service, Async Task & Thread หากฉันไม่ผิดพวกเขาทั้งหมดจะใช้ทำบางสิ่งในพื้นหลัง ดังนั้นวิธีการตัดสินใจที่จะใช้และเมื่อใด


ดูเหมือนว่ามีสิ่งหนึ่งที่มากขึ้นกับคนที่สามารถรับสับสนมักจะ - รถตักล้อยาง หัวข้อที่เกี่ยวข้อง - Asynctask vs Thread vs Services vs Loader
RBT

คำตอบ:


186

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

  • บริการเป็นเหมือนกิจกรรม แต่ไม่มีส่วนต่อประสานผู้ใช้ อาจเป็นไปได้ว่าหากคุณต้องการดึงข้อมูลสภาพอากาศเช่นคุณจะไม่สร้างกิจกรรมว่างเปล่าสำหรับกิจกรรมนี้คุณจะต้องใช้บริการ

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

  • AsyncTask เป็นเธรดอัจฉริยะที่แนะนำให้ใช้ ฉลาดหลักแหลมเพราะมันสามารถช่วยได้ด้วยวิธีการและมีสามวิธีที่ทำงานบนเธรด UI ซึ่งเป็นสิ่งที่ดีในการอัปเดตองค์ประกอบ UI

ฉันกำลังใช้บริการ AsyncTasks บ่อยครั้ง ด้ายน้อยลงหรือไม่เลยเพราะฉันสามารถทำเกือบทุกอย่างด้วย AsyncTask


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

16
คุณต้องใช้ทั้งคู่ คุณสร้างบริการและภายในที่คุณใช้ AsyncTask
Pentium10

4
เพิ่มไปยังคำตอบข้างต้น AsyncTask ผ่าน 4 ขั้นตอนใน onPreExecute (), onProgressUpdate (ความคืบหน้า ... ) onPostExecute (ผลลัพธ์), {ทำงานในเธรด UI}, doInBackground (Params ... ) {ทำงานในเธรดพื้นหลัง} เนื่องจากมี 3 วิธีในเธรด UI ผู้ใช้จึงไม่ต้องกังวลกับการใช้ตัวจัดการหรือการเรียกกลับเพื่ออัปเดต UI
SpunkerBaba

11
@ Pentium10: แทน Service + AsyncTask คุณมักจะสามารถใช้ IntentService ได้
njzk2

11
สิ่งที่น่าสังเกตอีกอย่างคือโดยค่าเริ่มต้นบริการ Android จะทำงานบนเธรดหลัก (UI) หากบริการของคุณต้องทำงานในพื้นหลังจะต้องเปิดใช้งานในเธรดแยกต่างหาก (หรือ AsyncTask) อย่างชัดเจน มิฉะนั้นอาจเสี่ยงต่อการขัดจังหวะการตอบสนองของ UI และโยนแอปพลิเคชันไม่ตอบสนองข้อผิดพลาด บริการ wrt Android เป็นหลักกิจกรรม 'ล่องหน' และ 'จิ๋ว' ไม่จำเป็นต้องเป็นคนทำงาน 'พื้นหลัง'
CCJ

23

นี่คือคำตอบที่ง่ายที่สุดสำหรับคำถามของคุณ

เกลียว

เป็นหน่วยของการดำเนินการที่เรียกใช้ "ขนาน" กับเธรดหลักเป็นจุดสำคัญคุณไม่สามารถอัปเดตองค์ประกอบ UI จากเธรดใด ๆ ที่นี่ยกเว้นเธรดหลัก

AsyncTask

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

บริการ

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


4
AyncTask จะไม่ถูกสร้างขึ้นใหม่ในการหมุนอุปกรณ์เพราะมันไม่ได้ซิงค์กับวิธีวงจรชีวิตของกิจกรรม
CopsOnRoad

4
คุณสร้าง AsyncTask ใน hook lifecycle กิจกรรมและเมื่อคุณหมุนโทรศัพท์กิจกรรมจะถูกทำลายและเริ่มต้นใหม่ อินสแตนซ์ previus ของ AsyncTask เชื่อมต่อกับกิจกรรมที่คุณเพิ่งทำลายและด้วยเหตุนี้คุณจะได้รับ "บังคับปิด" แต่คุณจะเห็นว่าอินสแตนซ์ใหม่ของ AsynTask ได้รับการกระตุ้นอีกครั้งอย่างไร คุณสามารถใช้ Fragments เพื่อเก็บ AsyncTask และตั้งค่า setRetainInstance (จริง) บน Fragment ที่จะช่วยคุณ
Alejandro Serret

15

ข้อมูลเพิ่มเติมไม่กี่ฉันต้องการมีคนบอกฉันไม่กี่วันที่ผ่านมา:

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

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


9

ในระยะสั้นบริการสำหรับtime consuming tasks, AsyncTaskสำหรับshort-lived tasks, กระทู้เป็นstandard java constructionสำหรับหัวข้อ


3

จากมุมมองของนักพัฒนา:

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

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

บริการ : เป็นกระบวนการพื้นหลัง มันถูกใช้เมื่อคุณต้องทำการประมวลผลบางอย่างที่ไม่มี UI ใด ๆ ที่เกี่ยวข้อง


1
ServiceIntentServiceจะไม่ทำงานที่จำเป็นในพื้นหลังเว้นแต่คุณจะใช้ หากคุณเริ่มต้นรูปแบบมาตรฐานServiceจาก UiThread มันจะทำงานบน UiThread
yshahak

@yshahak คุณถูกต้อง แต่ที่นี่เราไม่ต้องการคำจำกัดความที่ลึกซึ้ง ผู้ใช้เพียงแค่ต้องการทราบความแตกต่างระหว่างพวกเขา
ราหุลเร

ใช่ แต่สิ่งนี้ไม่ถูกต้องเนื่องจากServiceจะไม่ทำงานในกระบวนการอื่นตามค่าเริ่มต้น แต่ในกระบวนการแอปด้วยส่วนประกอบอื่น ๆ ดีกว่าที่จะบอกว่าServiceจะทำงานในพื้นหลังของเธรดที่มันอาศัยอยู่ภายใน
yshahak

ทั้งหมดสามข้อทำงานในกระบวนการสมัคร preExecute () และวิธี postExecute () ของ ASyncTask ทำงานบน UIThread และ doInBackground () & onProgress () ทำงานบนเธรดพื้นหลัง บริการทำงานบนเธรดพื้นหลังและเธรดยังทำงานบนเธรดพื้นหลัง อย่างไรก็ตามตัวจัดการทำงานบน UI Thread
ราหุลเร

2

การบริการเป็นเหมือนกิจกรรมที่ต้องใช้เวลานาน แต่ภารกิจ Async ช่วยให้เราสามารถทำการดำเนินการที่ยาวนาน / พื้นหลังและแสดงผลลัพธ์บนเธรด UI โดยไม่ต้องจัดการเธรด

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