112

Tôi đang sử dụng AsyncTasks để tìm nạp dữ liệu để đáp ứng với người dùng nhấn nút. Điều này hoạt động tốt và giữ cho giao diện phản hồi nhanh trong khi tìm nạp dữ liệu, nhưng khi tôi kiểm tra những gì đang xảy ra trong trình gỡ lỗi Eclipse, tôi phát hiện ra rằng mỗi khi một cái mới AsyncTaskđược tạo ra (điều này khá thường xuyên, bởi vì chúng chỉ có thể được sử dụng một lần ), một chủ đề mới đã được tạo nhưng không bao giờ chấm dứt.

Kết quả là một số lượng lớn các AsyncTaskchủ đề chỉ ngồi đó. Tôi không chắc đây có phải là vấn đề trong thực tế hay không, nhưng tôi thực sự muốn loại bỏ những chủ đề phụ đó.

Làm thế nào tôi có thể giết những chủ đề này?

|
  • Bạn có ý nghĩa gì với "không bao giờ chấm dứt"? Tác vụ không bao giờ kết thúc phương thức doInbackground của nó hay bạn chỉ nhìn thấy đối tượng asynctask trong trình phân bổ?

    – Lê Phương Quỳnh 22:29:51 19/06/2010
  • 7

    Các doInBackgroundphương pháp hoàn tất, nhưng các chủ đề tiếp tục xuất hiện trong cửa sổ gỡ lỗi. Ví dụ: Thread [<23> AsyncTask #4](Running)

    – Trịnh Thảo Ly 02:35:32 20/06/2010
200

AsyncTaskquản lý một nhóm luồng, được tạo bằng ThreadPoolExecutor. Nó sẽ có từ 5 đến 128 chủ đề. Nếu có nhiều hơn 5 luồng, các luồng bổ sung đó sẽ dính xung quanh tối đa 10 giây trước khi bị xóa. (lưu ý: những số liệu này dành cho mã nguồn mở hiện có thể nhìn thấy và thay đổi theo bản phát hành Android).

Để lại AsyncTaskchủ đề một mình, xin vui lòng.

|
  • 1

    uff! thật tốt khi nghe điều đó! hehe :)

    – Vũ Kim Mai 23:48:52 19/06/2010
  • 1

    Có lẽ để tiết kiệm thời gian cho các chủ đề trong các yêu cầu sau này.

    – Hoàng Quân Dương 11:26:29 20/06/2010
  • 1

    Câu trả lời hay

    – Tạ Phương Thi 09:40:48 18/07/2012
  • 1

    @SaletanthKarumanaghat: Sử dụng một AsyncTaskthứ gì đó sẽ mất nhiều thời gian là một ý tưởng tồi nói chung. Nhưng không, nhận xét của tôi về các chủ đề thêm sẽ biến mất khi chúng không được sử dụng. Vì vậy, khi một trong 6 nhiệm vụ của bạn kết thúc, luồng của nó sẽ ở lại trong nhóm trong 10 giây, sau đó luồng đó sẽ bị chấm dứt.

    – Ngô Thụy Trinh 11:34:10 16/02/2018
  • 1

    @SaletanthKarumanaghat: "Câu hỏi của tôi là liệu có hạn chế nào khi chạy 20 (nói) AsyncT Nhiệm vụ song song không?" - sử dụng đáng kể của AsyncTaskngày hôm nay không phải là một kế hoạch tuyệt vời. Có hơn 20 giây có thể chạy trong hơn 10 giây là loại điều không nên xem xét mã. Nếu bạn tạo 20 nhiệm vụ liên tiếp, chỉ một số ít sẽ chạy cùng một lúc và phần còn lại sẽ được xếp hàng để thực hiện sau. Có bao nhiêu sẽ chạy cùng một lúc dựa trên số lượng lõi của CPU. AFAIK, thuật toán hiện tại là các luồng song song 2N + 1, trong đó N là số lõi.

    – Hoàng Tuệ Lâm 11:40:43 16/02/2018
23

Ngoài phản hồi của CommonsWare:

Hiện tại tôi đang sử dụng Android 2.2 và ứng dụng của tôi sử dụng không quá một AsyncTask bất cứ lúc nào, nhưng tôi đang tạo một cái mới mỗi x phút. Lúc đầu, Chủ đề AsyncTask mới bắt đầu xuất hiện (Chủ đề mới cho AsyncTask mới) nhưng sau 5 luồng (như CommonsWare đã đề cập), chúng chỉ hiển thị trong cửa sổ gỡ lỗi và được sử dụng lại khi cần các luồng AsyncTask mới. Họ chỉ ở đó cho đến khi trình gỡ lỗi ngắt kết nối.

|
3

Triệu chứng tương tự ở đây. Trong trường hợp của tôi, các chủ đề bị treo xung quanh sau khi tôi giết Hoạt động và tôi hy vọng Ứng dụng sẽ đóng hoàn toàn. Vấn đề được giải quyết một phần bằng cách sử dụng một trình thực thi luồng đơn:

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());

Điều này làm cho chủ đề biến mất sau khi hoàn thành công việc của nó.

|
  • 1

    Câu trả lời này đã khiến AsyncTask biến mất sau khi nó chạy, có thể đó không phải là "cách làm việc của google" nhưng nó hoàn thành công việc. Cảm ơn bạn.

    – Vũ Phi Nhạn 14:50:00 24/04/2014
  • 1

    Điều này đã giải quyết vấn đề cụ thể của tôi về việc chạy Asynct task trên một luồng.

    – Lý Nhật Quang 06:47:15 12/03/2015

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.