Sự khác biệt giữa Dịch vụ, Nhiệm vụ & Chủ đề Async?


147

Sự khác biệt giữa Service, Async Task & Thread. Nếu tôi không sai, tất cả chúng được sử dụng để làm một số thứ trong nền. Vậy, làm thế nào để quyết định sử dụng và khi nào?


Dường như có một điều nữa mà mọi người có thể bị lẫn lộn thường - Máy bốc hàng . Chủ đề liên quan - Asynctask vs Thread vs Services vs Loader
RBT

Câu trả lời:


186

Có lẽ bạn đã đọc mô tả tài liệu về họ, tôi sẽ không lặp lại chúng, thay vào đó tôi sẽ cố gắng đưa ra câu trả lời bằng chính lời nói của mình, hy vọng họ sẽ giúp bạn.

  • Dịch vụ giống như một Hoạt động nhưng không có giao diện người dùng. Có thể nếu bạn muốn tìm nạp thời tiết, ví dụ bạn sẽ không tạo một hoạt động trống cho nó, vì điều này bạn sẽ sử dụng Dịch vụ.

  • Một chủ đề là một chủ đề, có lẽ bạn đã biết nó từ phần khác. Bạn cần biết rằng bạn không thể cập nhật giao diện người dùng từ một Chủ đề. Bạn cần sử dụng Handler cho việc này, nhưng đọc thêm.

  • AsyncTask là một Chủ đề thông minh được khuyên nên sử dụng. Thông minh vì nó có thể giúp với các phương thức của nó và có ba phương thức chạy trên luồng UI, rất tốt để cập nhật các thành phần UI.

Tôi đang sử dụng Dịch vụ, AsyncT task thường xuyên. Chủ đề ít hơn, hoặc hoàn toàn không, vì tôi có thể làm hầu hết mọi thứ với AsyncTask.


1
Cảm ơn lời giải thích của bạn. Vì vậy, nếu tôi cần tạo một ứng dụng lấy dữ liệu từ web, thì đó sẽ là một dịch vụ tùy chọn tốt hơn hoặc tác vụ không đồng bộ?
SpunkerBaba

16
Bạn cần sử dụng cả hai. Bạn tạo một Dịch vụ và bên trong bạn sử dụng AsyncTask.
Pentium10

4
Thêm vào câu trả lời ở trên, AsyncTask trải qua 4 bước onPreExecute (), onProTHERUpdate (Progress ...) onPostExecute (Kết quả), {chạy trong UI UI}, doInBackground (Params ...) {chạy trong luồng nền}. Vì nó cung cấp 3 phương thức trong luồng UI, người dùng không cần phải lo lắng về việc sử dụng trình xử lý hoặc cuộc gọi lại để cập nhật UI.
SpunkerBaba

11
@ Pentium10: thay vì Service + AsyncTask, bạn thường có thể sử dụng IntentService
njzk2

11
Cũng đáng chú ý là theo mặc định, các dịch vụ Android chạy trên luồng chính (UI). Nếu dịch vụ của bạn cần thực hiện công việc ở chế độ nền, thì nó cần được khởi chạy trong một luồng riêng biệt (hoặc AsyncTask) một cách rõ ràng. Nếu không, nó có thể có nguy cơ làm gián đoạn phản hồi của UI và ném Ứng dụng Không phản hồi lỗi. Một dịch vụ dành cho Android về cơ bản là một Hoạt động 'vô hình' và 'thu nhỏ', KHÔNG nhất thiết phải là một nhân viên 'nền'.
CCJ

23

Đây là câu trả lời dễ nhất cho câu hỏi của bạn

Chủ đề

là một đơn vị thực thi chạy "song song" với Chủ đề chính là một điểm quan trọng, bạn không thể cập nhật thành phần UI từ bất kỳ luồng nào ở đây ngoại trừ luồng chính.

AsyncTask

là một luồng đặc biệt, cung cấp cho bạn các phương thức trợ giúp để cập nhật giao diện người dùng để về cơ bản bạn có thể cập nhật giao diện người dùng ngay cả AsyncTask sẽ chạy trên một luồng nền. Xử lý giao tiếp giữa các quá trình là không cần thiết phải được thực hiện rõ ràng.

Dịch vụ

giải quyết vấn đề trên bởi vì nó sống tách biệt với hoạt động gọi nó để nó có thể tiếp tục chạy ngay cả khi hoạt động bị hủy, nó chạy trong Chủ đề chính (hãy cẩn thận với ANR) sử dụng dịch vụ nền (mở rộng IntentService mà nó tự động tạo ra luồng công nhân cho bạn) . Dịch vụ giống như một hoạt động không có UI , tốt cho nhiệm vụ lâu dài


4
AyncTask sẽ không được tạo lại khi xoay thiết bị vì thiết bị không đồng bộ với các phương thức vòng đời Activity.
CopsOnRoad

4
bạn tạo AsyncTask trong móc vòng đời Hoạt động và khi bạn xoay điện thoại, Hoạt động bị hủy và khởi động lại. Ví dụ phổ biến của AsyncTask được kết nối với Hoạt động mà bạn vừa phá hủy và vì lý do đó, bạn sẽ nhận được "Buộc đóng" nhưng bạn cũng sẽ thấy một phiên bản mới của AsynTask được kích hoạt lại. Bạn có thể sử dụng Fragment để giữ lại AsyncTask và đặt setRetainInstance (true) trên Fragment sẽ giúp bạn.
Alejandro Serret

15

Một vài thông tin tôi muốn ai đó đã nói với tôi vài ngày trước:

  • Bạn có thể chia sẻ các biến toàn cục - chẳng hạn như chuỗi - giữa Hoạt động và Dịch vụ.
  • Ứng dụng của bạn cùng với tất cả các biến toàn cầu của nó sẽ không bị xóa sổ miễn là vẫn còn Hoạt động hoặc Dịch vụ.
  • Nếu bạn có phiên bản Dịch vụ trong ứng dụng của mình và HĐH cần tài nguyên, trước tiên, nó sẽ giết Hoạt động của bạn, nhưng miễn là có Dịch vụ, HĐH sẽ không xóa ứng dụng của bạn cùng với các biến toàn cục.

Trường hợp sử dụng của tôi là như thế này: Tôi có một luồng trong không gian toàn cầu được kết nối với máy chủ và một Hoạt động hiển thị kết quả. Khi người dùng nhấn nút home, Hoạt động sẽ chuyển sang nền và Dịch vụ mới được bắt đầu. Dịch vụ này sau đó đọc kết quả từ chuỗi và hiển thị thông tin trong vùng thông báo khi cần. Tôi không lo lắng về việc HĐH phá hủy Hoạt động của tôi vì tôi biết rằng miễn là Dịch vụ hoạt động thì nó sẽ phá hủy chuỗi.


9

Nói tóm lại, Service for time consuming tasks, AsyncTask for short-lived tasks, Thread là một standard java constructionchủ đề.


3

Từ quan điểm của nhà phát triển:

Chủ đề : Được sử dụng để thực thi tập hợp thành mã song song với luồng chính. Nhưng bạn không thể xử lý UI bên trong chuỗi. Cho rằng bạn cần phải sử dụng Handler. Hadler hoạt động như luồng nhưng cũng có thể xử lý UI.

ASyncTask : Được sử dụng để xử lý các tác vụ mà bạn không thể thực hiện để làm việc trên luồng chính. Ví dụ: một yêu cầu HTTP là một công việc rất nặng không thể xử lý được trên luồng chính, vì vậy bạn xử lý yêu cầu HTTP trong ASyncTaskNó hoạt động song song với luồng chính của bạn Không đồng bộ trong nền. Nó có một vài phương thức gọi lại được gọi trên tương ứng của chúng sự kiện.

Dịch vụ : Là một quá trình nền. Nó được sử dụng khi bạn phải thực hiện một số xử lý không có bất kỳ UI nào được liên kết với nó.


1
Servicesẽ không cần thiết chạy trong nền trừ khi bạn sử dụng IntentService. Nếu bạn bắt đầu một standart Servicetừ UiThread, nó sẽ chạy trên UiThread.
yshahak

@yshahak Bạn đúng, nhưng ở đây chúng tôi không cần định nghĩa sâu. Người dùng chỉ muốn biết sự khác biệt giữa chúng.
Rahul Raina

Có, nhưng điều này không chính xác, vì Servicesẽ không chạy trong một quy trình khác theo mặc định, nhưng trong quy trình ứng dụng với các thành phần khác. Tốt hơn nên nói rằng nó Servicesẽ chạy trong Nền của Chủ đề mà nó sống bên trong.
yshahak

Tất cả ba công việc trên trong quá trình ứng dụng. Các phương thức preExecute () và postExecute () của ASyncTask hoạt động trên UIThread và doInBackground () & onProTHER () hoạt động trên luồng nền. Dịch vụ hoạt động trên nền Chủ đề và Chủ đề cũng hoạt động trên chủ đề nền. Tuy nhiên Handler hoạt động trên UI Thread.
Rahul Raina

2

dịch vụ giống như hoạt động tiêu tốn thời gian dài nhưng tác vụ Async cho phép chúng tôi thực hiện các thao tác dài / nền và hiển thị kết quả của nó trên luồng UI mà không phải thao tác các luồng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.