Asynctask vs Chủ đề trong Android


135

Trong UI, để thực hiện một số công việc nền, tôi đã sử dụng riêng Thread. Nhưng theo đề xuất của người khác, tôi hiện đang sử dụng AsyncTask.

Sự khác biệt chính giữa a Threadvà an là AsyncTaskgì?

Trong trường hợp nào, tôi nên sử dụng một Threadhoặc một AsyncTask?



@ webaldo.at Tôi đã giới thiệu điều này, ở đây họ đã nhập mô tả và sự khác biệt giữa Asynctask và Thread. Tôi muốn biết trường hợp nào ví dụ kết nối mạng, tập tin đọc cho những gì tôi sử dụng?.
Ram

Rút ngắn: Chủ đề -> Không có quyền truy cập vào giao diện người dùng | | Asynctask -> Truy cập có điều kiện vào UI-Thread
JavaDM

cho tác vụ nền IntentService là một tùy chọn tốt khác.
Chen

Câu trả lời:


146

Đối với các tác vụ dài hạn hoặc sử dụng nhiều CPU, về cơ bản có hai cách để thực hiện việc này: các luồng Java và AsyncTask nguyên gốc của Android.

Không cái nào nhất thiết phải tốt hơn cái kia, nhưng biết khi nào nên sử dụng mỗi cuộc gọi là điều cần thiết để thúc đẩy hiệu suất của hệ thống vì lợi ích của bạn.

Sử dụng AsyncTask cho:

  1. Các thao tác mạng đơn giản không yêu cầu tải xuống nhiều dữ liệu
  2. Các tác vụ giới hạn trên đĩa có thể mất hơn vài mili giây

Sử dụng các luồng Java cho:

  1. Các hoạt động mạng liên quan đến lượng dữ liệu vừa phải đến lớn (tải lên hoặc tải xuống)
  2. Các tác vụ CPU cao cần được chạy trong nền
  3. Bất kỳ tác vụ nào mà bạn muốn kiểm soát việc sử dụng CPU liên quan đến luồng GUI

Và có rất nhiều tài nguyên tốt trên internet có thể giúp bạn:

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


Tôi có thể hỏi tại sao số lượng dữ liệu tải xuống là một vấn đề?
Yeung

1
@Yeung Có vẻ như bạn cần cái nhìn sâu sắc về Nhiệm vụ Async! Hãy nhìn, số lượng dữ liệu lớn hơn sau đó rõ ràng lớn hơn thời gian thực hiện để hoàn thành cùng một hoạt động. Do đó, không phải là một cách thực hành tốt để thực hiện quá trình chạy dài bằng cách sử dụng Tác vụ Async vì các lý do sau: 1. Nhiệm vụ Async bị ràng buộc kém với vòng đời Hoạt động. 2. Họ tạo ra rò rỉ meomory.
Mohit


Cảm ơn bạn. Tôi hiểu rủi ro bây giờ.
Yeung

@Impasse @Yeung Lượng dữ liệu IMO không phải là vấn đề, vấn đề chính với mạng hoạt động là thời gian hoạt động. Ngay cả việc tải xuống một vài byte có thể mất nhiều thời gian, khi máy chủ đang bận, không thể truy cập (hết thời gian), v.v ... Một cách khắc phục có thể được sử dụng AsyncTaskvới bộ lập lịch riêng.
xmedeko

44

Nếu bạn sử dụng các luồng Java, bạn phải xử lý các yêu cầu sau trong mã của riêng bạn:

Đồng bộ hóa với luồng chính nếu bạn gửi lại kết quả cho giao diện người dùng

Không có mặc định để hủy chủ đề

Không có nhóm chủ đề mặc định

Không có mặc định để xử lý các thay đổi cấu hình trong Android


3
điều này thực sự rõ ràng hơn vì nó giải quyết lý do tại sao không sử dụng Chủ đề đơn giản. Từ đầu tôi, bất cứ điều gì cần được gắn với vòng đời Hoạt động / Dịch vụ nên sử dụng AsyncTask thay vào đó, mặc dù bạn cần phải "làm giảm tài nguyên" một cách thủ công trong nhiệm vụ, ít nhất là bạn không bị treo nhiệm vụ khi hoạt động bị giết
leRobot

28

Chủ đề

  • Nhiệm vụ dài nói chung
  • Gọi bằng phương thức thread.start ()
  • Kích hoạt từ bất kỳ chủ đề
  • Chạy trên chủ đề riêng của nó
  • Quản lý luồng / mã thủ công có thể trở nên khó đọc

AsyncTask

  • Nhiệm vụ nhỏ phải giao tiếp với chủ đề chính
  • Gọi bằng phương thức excute ()
  • Kích hoạt từ chủ đề chính
  • Chạy trên luồng công nhân
  • Phải được thực thi và tạo từ luồng chính

11

Chủ đề

Một chủ đề là một đơn vị thực hiện đồng thời. Nó có ngăn xếp cuộc gọi riêng của mình. Có hai phương pháp để thực hiện các luồng trong các ứng dụng.

Một là cung cấp một lớp mới mở rộng Thread và ghi đè phương thức run () của nó. Cái kia đang cung cấp một cá thể Thread mới với một đối tượng Runnable trong quá trình tạo nó. Một luồng có thể được thực thi bằng cách gọi phương thức "bắt đầu" của nó. Bạn có thể đặt "Mức độ ưu tiên" của một luồng bằng cách gọi phương thức "setP Warriority (int)" của nó.

Một chuỗi có thể được sử dụng nếu bạn không có ảnh hưởng trong phần UI. Ví dụ: bạn đang gọi một số dịch vụ web hoặc tải xuống một số dữ liệu và sau khi tải xuống, bạn đang hiển thị nó trên màn hình của mình. Sau đó, bạn cần sử dụng Trình xử lý với Chủ đề và điều này sẽ làm cho ứng dụng của bạn trở nên phức tạp để xử lý tất cả các phản hồi từ Chủ đề.

Trình xử lý cho phép bạn gửi và xử lý các đối tượng Message và Runnable được liên kết với MessageQueue của một luồng. Mỗi luồng có mỗi hàng đợi tin nhắn. (Giống như Danh sách việc cần làm) và chuỗi sẽ nhận từng thông báo và xử lý nó cho đến khi hàng đợi tin nhắn trống. Vì vậy, khi Handler giao tiếp, nó chỉ đưa ra một thông báo cho chuỗi người gọi và nó sẽ chờ để xử lý.

Nếu bạn sử dụng các luồng Java thì bạn cần xử lý các yêu cầu sau trong mã của riêng bạn:

Đồng bộ hóa với luồng chính nếu bạn gửi lại kết quả cho giao diện người dùng Không có mặc định để hủy luồng Không có nhóm luồng mặc định Không có mặc định để xử lý các thay đổi cấu hình trong Android

AsyncTask

AsyncTask cho phép sử dụng luồng UI thích hợp và dễ dàng. Lớp này cho phép thực hiện các hoạt động nền và xuất bản kết quả trên luồng UI mà không phải thao tác với các luồng và / hoặc trình xử lý. Một tác vụ không đồng bộ được xác định bởi một tính toán chạy trên luồng nền và kết quả được công bố trên luồng UI.

AsyncTask sẽ trải qua 4 giai đoạn sau:

onPreExecute ()

Được gọi trên luồng UI trước khi tác vụ được thực thi

doInbackground (Params ..)

Được gọi trên luồng nền ngay sau khi onPreExecute () kết thúc thực thi.

onProTHERUpdate (Tiến trình ..)

Được gọi trên luồng UI sau khi có lệnh gọi xuất bản (Tiến trình ...).

onPostExecute (Kết quả)

Được gọi trên luồng UI sau khi tính toán nền kết thúc.

Tại sao bạn nên sử dụng AsyncTask?

Dễ dàng sử dụng cho một giao diện người dùng. (Vì vậy, sử dụng nó khi luồng người gọi là một luồng UI).

Không cần phải thao tác Xử lý.

Để biết thêm thông tin truy cập tại đây


2

Chủ đề:

Threadnên được sử dụng để tách các hoạt động chạy dài khỏi luồng chính để hiệu suất được cải thiện. Nhưng nó không thể bị hủy một cách thanh lịch và nó không thể xử lý các thay đổi cấu hình của Android. Bạn không thể cập nhật giao diện người dùng từ Thread.

AsyncTaskcó thể được sử dụng để xử lý các mục công việc trong thời gian ngắn hơn 5ms. Với AsyncTask, bạn có thể cập nhật UI không giống như java Thread. Nhưng nhiều tác vụ chạy dài sẽ làm nghẹt hiệu suất.

Bạn có thêm vài lựa chọn thay thế cho cả hai.

HandlerThread / HandlerThreadPoolExecutor

Tham khảo bài viết dưới đây để biết thêm chi tiết:

Xử lý vs AsyncTask vs Chủ đề

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.