2013-07-04 43 views
52

Tôi có câu hỏi mà tôi câu đố.Sự khác biệt giữa AsyncTask và Chủ đề/Runnable

Hãy tưởng tượng tôi muốn làm điều gì đó trong một chuỗi khác, như tìm nạp nội dung GPS/Vị trí, như được đề xuất trong tài liệu SDK, phải sử dụng chuỗi nền.

Vì vậy, đây là câu hỏi: Sự khác nhau giữa

  1. Tạo một Thread ở chế độ nền qua AsyncTask

  2. Tạo Thread thread1 = new Thread(new Runnable() ... và thực hiện run() là gì?

Trả lời

40

AsyncTask là một lớp tiện để thực hiện một số công việc về một chủ đề mới và sử dụng kết quả trên thread mà từ đó nó đã được gọi là (thường là thread UI) khi hoàn tất. Nó chỉ là một wrapper trong đó sử dụng một vài runnables nhưng xử lý tất cả các phức tạp của việc tạo ra các chủ đề và xử lý tin nhắn giữa các chủ đề.

AsyncTask cho phép sử dụng thích hợp và dễ dàng chuỗi giao diện người dùng. Lớp này cho phép thực hiện các thao tác nền và xuất bản các kết quả trên luồng giao diện người dùng mà không cần phải thao tác các luồng và/hoặc các trình xử lý.

AsyncTask được thiết kế để trở thành lớp trợ giúp xung quanh Chủ đề và Trình xử lý và không cấu thành một khuôn khổ luồng chung. AsyncTasks lý tưởng nên được sử dụng cho các hoạt động ngắn (tối thiểu là vài giây). Nếu bạn cần giữ các luồng chạy trong một khoảng thời gian dài, bạn nên sử dụng các API khác nhau được cung cấp bởi java.util.concurrent pacakge như Executor, ThreadPoolExecutor và FutureTask.

Tác vụ không đồng bộ được xác định bằng tính toán chạy trên chuỗi nền và kết quả được xuất bản trên chuỗi giao diện người dùng. Một tác vụ không đồng bộ được định nghĩa bởi 3 loại generic, được gọi là Params, Progress và Result, và 4 bước, được gọi là onPreExecute, doInBackground, onProgressUpdate và onPostExecute.

Giao diện Runnable là cốt lõi của luồng Java. Giao diện Runnable nên được thực hiện bởi bất kỳ lớp nào mà các cá thể của nó được dự định thực hiện bởi một luồng.

Ngoài ra nếu tôi trích dẫn từ this blog:

nếu bạn cần SIMPLE mã hóa sử dụng AsyncTask và nếu bạn cần sử dụng TỐC ĐỘ truyền thống java Chủ đề.

+0

Do lưu ý mặc dù, rằng tùy thuộc vào phiên bản của Android mã của bạn chạy trên, chỉ có thể có một AsyncTask chạy cùng một lúc . –

+1

@AlexGittemeier Ngay cả trên các phiên bản đó, bạn có thể yêu cầu nó chạy nhiều hơn bằng cách sử dụng executeOnExecutor và yêu cầu nó sử dụng một nhóm, thay vì chỉ thực thi cuộc gọi. –

+1

AsyncTask: Phản hồi sau khi hoàn thành quá trình, Chủ đề: quá trình hoàn thành. –

1

Cũng tính số lần bắt đầu từ Android v4.04, bạn không thể nhiều hơn một AsyncTask cùng một lúc, trừ khi bạn mất khả năng tương thích với các phiên bản thấp hơn. Hãy nhận biết!

+5

Bạn có thể, nếu bạn sử dụng 'executeOnExecutor()' (mà bạn có thể làm điều kiện, vì vậy bạn sẽ không mất khả năng tương thích). – matiash

0

Một nhược điểm rõ ràng đối với lớp AsyncTask là sau khi các asynctask được chạy trên Android 3.0 được thực hiện theo trình tự thời gian bắt đầu. đó là các nhiệm vụ được thực hiện từng cái một, trừ khi bạn thực thi tác vụ bằng cách gọi 'executeOnExecutor (Executors.newCachedThreadPool())'. phương pháp này sẽ tạo hồ bơi chủ đề của riêng bạn.

1

khác biệt chính:

  1. AsyncTask là một nhiệm vụ không đồng bộ được xác định bởi một tính toán chạy trên một sợi nền và có kết quả được công bố trên thread UI. Nó không thể được thực hiện với thread bình thường trừ khi bạn sử dụng Handler trên UI Thread và gửi một tin nhắn HOẶC trực tiếp thay đổi thuộc tính của một đối tượng bằng cách thực hiện đồng bộ hóa thích hợp.

  2. Theo đề xuất của nhà phát triển hướng về Thread performance,

    Có một vài khía cạnh hiệu suất quan trọng cần lưu ý. Đầu tiên, theo mặc định, một ứng dụng sẽ đẩy tất cả các đối tượng AsyncTask mà nó tạo ra thành một chuỗi duy nhất. Do đó, chúng thực thi theo kiểu nối tiếp, và — như với luồng chính — một gói công việc đặc biệt dài có thể chặn hàng đợi. Vì lý do này, chúng tôi khuyên bạn chỉ nên sử dụng AsyncTask để xử lý các mục công việc ngắn hơn 5 mili giây..

    Nhưng thông thường Thread có thể được sử dụng cho các tác vụ chạy dài.

Chuỗi đồng bằng java không hữu ích cho Android không giống như HandlerThread, được khung Android cung cấp.

Lớp tiện dụng để bắt đầu một chuỗi mới có trình kích hoạt. Các looper sau đó có thể được sử dụng để tạo ra các lớp xử lý. Lưu ý rằng start() vẫn phải được gọi.

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

Handler vs AsyncTask vs Thread

Các vấn đề liên quan