2012-03-07 26 views
6

Điều này cần có câu trả lời dễ dàng, nhưng tôi không thể tìm thấy bất kỳ câu trả lời nào. Và kể từ khi tôi vẫn là một giả android tôi đến đây để hỏi bạn mọi người.Có giới hạn AsyncTask được thực thi cùng một lúc không?

Tôi đã thực hiện dự án này thực hiện 10 AsyncTask khi khởi động. Mỗi tác vụ chứa 3 URL thu thập dữ liệu ở đó và không làm gì quan trọng trong ứng dụng (chưa).

Tôi cũng có 10 lần xem văn bản mà tôi sử dụng để theo dõi tiến độ của AsyncTask.

Khi một nhiệm vụ bắt đầu TextView thích hợp được đưa vào "Start" Khi một nhiệm vụ đang tiến triển nó đặt TextView thích hợp của mình để "tải" Khi một nhiệm vụ được hoàn thành nó đặt TextView thích hợp của mình để "Finished"

Đây là những gì tôi quan sát và đã đặt câu hỏi về AsyncTask. Khi tôi khởi động ứng dụng, tôi nhận thấy 5 trong số các bản xem văn bản được chuyển sang điểm đánh dấu "Tải xuống", vì vậy tôi thấy 5 AsyncTask thực hiện công việc của mình như họ cần. Khi hoàn thành, nó sẽ khởi động AsyncTask mới. Tuy nhiên, họ không bao giờ đạt đến giới hạn đó là 5.

Điều gì khiến giới hạn 5 AsynchTask này chạy cùng một lúc? Tôi có gây ra điều này trong một số tập tin mà tôi không thể tìm thấy? Đây có phải là giới hạn của android 2.3.3 không? Có lẽ một giới hạn của thiết bị tôi đang sử dụng để mô phỏng ứng dụng?

Có ai có thể giải thích cho tôi không?

+0

Câu hỏi này được giải quyết tại đây: http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma

+0

@jengelsma Không thực sự. Nó chắc chắn liên quan, nhưng tại sao nó không vượt quá 5 là hơi khác với lý do tại sao nó không bao giờ dưới 5. Nó vẫn còn làm với kích thước hồ bơi lõi, nhưng câu hỏi/câu trả lời đó không giải thích tại sao kích thước hồ bơi lõi đó sẽ giới hạn số lượng tác vụ đồng thời đến 5 khi kích thước nhóm tối đa là 128. – kabuko

+0

Tôi nghĩ bạn đang sử dụng AsyncTask.execute() thay vì AsyncTask.executeOnExecutor() –

Trả lời

8

Có, có giới hạn. AsyncTask được hỗ trợ bởi một ThreadPoolExecutor với kích thước hồ bơi lõi là 5, nhưng kích thước hồ bơi tối đa là 128 (từ 1,6 - 4.0.3), vì vậy thực sự tôi nghĩ bạn sẽ thấy tất cả 10 của bạn chạy cùng một lúc. Bạn không thể thay đổi nó mặc dù. Nếu bạn thực sự muốn làm một cái gì đó khác (và tôi sẽ không khuyên bạn nên trừ khi bạn có một lý do rất cụ thể), bạn sẽ phải làm một cái gì đó tùy chỉnh với một kích thước hồ bơi lớn hơn hoặc chỉ spin lên một loạt các chủ đề bằng tay.

Cập nhật:

Đây là những gì các tài liệu nói:

Nếu có nhiều hơn corePoolSize nhưng ít hơn maximumPoolSize đề chạy, một chủ đề mới sẽ được tạo ra chỉ khi hàng đợi đã đầy.

Vì vậy, đó là lý do. Hàng đợi của bạn không đầy, vì vậy nó chỉ giữ nó ở kích thước hồ bơi cốt lõi.

+0

Đây là liên kết đến nguồn của [AsyncTask] (http: // grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/os/AsyncTask.java # AsyncTask) để tham khảo. – kabuko

+2

Bạn có thể cung cấp một cá thể 'Executor' tùy ý thành' executeOnExecutor() 'nếu bạn muốn tùy chỉnh cách xử lý' AsyncTask' của bạn. – Argyle

+1

@Argyle điểm tốt; đó là một lựa chọn tốt cho API 11 trở lên. – kabuko

0

01 Thread.py?Exchange có ThreadPoolSize, maxPoolSize và QueueCapacity. Nếu tất cả các chủ đề của bạn từ corePoolSize được sử dụng, bất kỳ nhiệm vụ nào khác được đặt trong hàng đợi của mỗi chủ đề từ nhóm lõi. Sau khi các hàng đợi này đầy, một chuỗi mới đang được khởi tạo, miễn là nó nằm trong giới hạn của maxPoolSize.

Bắt tại đây là hàng đợi của mỗi luồng (trừ khi được thay đổi theo chương trình) là UNBOUNDED. Điều đó có nghĩa rằng tất cả các chủ đề của bạn từ kích thước hồ bơi cốt lõi được sử dụng, và bất kỳ nhiệm vụ khác được xếp hàng đợi và chờ đến lượt của họ với một trong các chủ đề cốt lõi. Họ không bao giờ có cơ hội đạt được kích thước hồ bơi tối đa.

Bạn phải định cấu hình Trình thực thi của riêng mình và thay đổi dung lượng hàng đợi. Chúc may mắn!

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