2010-03-22 41 views
15

Tôi đang tìm nạp nhiều hình thu nhỏ từ một máy chủ từ xa và hiển thị chúng trong chế độ xem lưới, sử dụng AsyncTask. Vấn đề là, chế độ xem lưới của tôi hiển thị 20 hình thu nhỏ tại một thời điểm, để tạo 20 AsyncTask và bắt đầu 20 lần thực thi, mỗi lần một hình thu nhỏ.AsyncTask, RejectedExecutionException và Task Limit

Tôi nhận được RejectedExecution ngoại lệ trong mã của mình. Tôi nhớ lại đọc ở đâu đó rằng có một giới hạn về số lượng các nhiệm vụ mà AsyncTask có thể có trong hàng đợi của nó tại một thời điểm, tôi có thể đánh nó. Thanh này có được nâng lên không?

Có cách nào để tăng giới hạn này không? Có an toàn khi bỏ qua ngoại lệ này không? (Bằng cách để trống một khối catch(RejectedException e){}?)

Tôi đang chạy mã này trên trình giả lập Android 1.6 và cấp API trong mã của tôi (minSDKVersion là 3). [EDIT: Added SDK và mức API info]

Trả lời

17

Tôi nhớ đọc ở đâu đó rằng có là một giới hạn số nhiệm vụ mà AsyncTask có thể có trong hàng đợi của nó tại một thời điểm , tôi có thể đánh đó. Đã thanh này được nâng lên chưa?

AsyncTask xuất hiện để hỗ trợ 10 chủ đề và chiều sâu hàng đợi công việc là 10. Theo lý thuyết, điều đó chỉ hỗ trợ 20 mục ... nếu không có gì khác đang sử dụng AsyncTask.

Có cách nào để tăng giới hạn này không?

Lấy mã nguồn, sửa đổi, đặt mã nguồn vào gói của riêng bạn và sử dụng gói đó. Tôi đã làm điều này với AsyncTaskEx của tôi, mặc dù điều đó được dựa trên nguồn Android 1.5.

Có an toàn để bỏ qua điều này ngoại lệ không?

Công việc của bạn sẽ không được xếp hàng đợi để thực thi. Cho dù đó là "an toàn" là tùy thuộc vào bạn. Tôi không biết về bất kỳ tác động nào khác trên cơ sở hạ tầng AsyncTask.

+0

Cảm ơn Đánh dấu đã trả lời của bạn và cũng để chia sẻ mã của bạn! BTW, theo nhận xét của Romain Guy ở đây: http://stackoverflow.com/questions/990948/simple-thread-management-java-android giới hạn dường như đã được thư giãn. – Samuh

+0

Thật không may, tôi không thể xác nhận tuyên bố của anh ấy. Những gì tôi có ở trên là từ kiểm tra của tôi về mã nguồn (như được tìm thấy thông qua Google Code Search). Tuy nhiên, tôi có thể đang hiểu sai mã. – CommonsWare

+0

Tôi đang gặp vấn đề tương tự. Tôi sẽ hoàn toàn hạnh phúc khi thực hiện nhiệm vụ của mình theo thứ tự thay vì song song. Có cách nào để làm việc này không? Hoặc tôi sẽ trở lại để thực hiện một hàng đợi công việc? –

1

"An toàn" để bỏ qua - Bạn cần đảm bảo rằng bất kỳ loại thông báo nào mà bạn dự định thực hiện sau khi thực hiện sẽ được thực hiện tại đây khi bạn gặp lỗi - nếu không bạn có thể mã làm cho các giả định về việc nghe lại từ nhiệm vụ này.

7

Tôi đã tự làm chính xác điều này trong một ứng dụng.

Khởi chạy 20 luồng song song cùng một lúc để tải xuống hình thu nhỏ từ máy chủ và đẩy chúng vào bộ điều hợp dữ liệu không giống như ý tưởng hay đối với tôi. Tất cả những chủ đề đó sẽ chỉ đi qua nhau và theo cách của nhau.

Thay vào đó, tôi sẽ khởi chạy chỉ một chuỗi, cho phép thu thập hình thu nhỏ trong một vòng lặp và thêm chúng vào bộ điều hợp khi chúng đến.

2

Bạn có thể sử dụng trình thực thi nối tiếp với AsyncTask.executeOnExecutor, để tuần tự hóa các tác vụ của bạn, nhưng điều đó sẽ giới hạn tác vụ chỉ với một tác vụ đồng thời vào lúc đó. Có thể tốt khi xem hình thu nhỏ:

myAsyncTask.executeOnExecutor (MyAsyncTask.SERIAL_EXECUTOR, [params]);

2

Vấn đề là số lượng đang chờ xử lý AsyncTasks cho AsyncTask.THREAD_POOL_EXECUTOR là 128. Khi hàng đợi được lấp đầy không có hàng AsyncTask mới có thể được xếp hàng đợi.

Từ mã nguồn AsyncTask:

private static final BlockingQueue<Runnable> sPoolWorkQueue = 
     new LinkedBlockingQueue<Runnable>(128); 

Theo tôi giới hạn mà làm cho hoàn toàn không có ý nghĩa gì cả và AsyncTask.SERIAL_EXECUTOR có một hàng đợi không giới hạn.