2011-07-01 28 views
7

Ứng dụng của tôi sử dụng một số HandlerThread cho một vài thao tác được chia sẻ trên các thành phần cần chạy trên một chuỗi nền. Hầu hết thời gian, luồng này sẽ ở trạng thái chờ.Cần thiết để thoát khỏi HandlerThread?

Tôi có thể để số này HandlerThread chạy (chờ) trong ứng dụng của tôi, gửi tin nhắn cho nó bất cứ khi nào cần thiết, nhưng không bao giờ bỏ qua thông qua HandlerThread.getLooper().quit()? Điều này có nghĩa là HandlerThread này sẽ tiếp tục tồn tại trong trạng thái chờ của nó ngay cả sau khi tất cả các thành phần ứng dụng của tôi đã bị hủy.

Ban đầu, điều này dường như không lớn đối với tôi - điều mà tôi chắc chắn không muốn làm — nhưng tôi không chắc chắn bây giờ. Khi Android giết chết quá trình của tôi, giống như nó sẽ làm khi cần giải phóng thời gian hoặc bộ nhớ CPU, nó sẽ kết thúc luồng này cùng với chuỗi giao diện người dùng của tôi. Ngoài ra, các chủ đề sẽ được chờ đợi, do đó, nó sẽ không được tiêu thụ bất kỳ thời gian CPU. Và hơn thế nữa, ứng dụng của tôi sử dụng nhiều số AsyncTasks, mà tôi biết sử dụng một nhóm luồng. Từ sự hiểu biết của tôi, AsyncTask sử dụng ThreadPoolExecutor, không tuân theo bất kỳ cuộc gọi lại vòng đời ứng dụng nào (các chủ đề trong hồ bơi khi không sử dụng, chỉ cần chờ đợi). Vì vậy, câu hỏi của tôi là, tôi có thể sử dụng HandlerThread trên nhiều thành phần ứng dụng, không bao giờ (hoặc hiếm khi) bỏ nó, và để nó chờ đợi khi không sử dụng, mà không bị ảnh hưởng xấu đến khủng khiếp?

Trả lời

1

Sở thích cá nhân của tôi là tạo chủ đề mới bất cứ khi nào có nhu cầu và làm sạch nó khi hoàn thành. Bằng cách này tôi không có bất kỳ vấn đề với nhiều thành phần cố gắng sử dụng cùng một sợi cùng một lúc và tôi giữ một "tàu sạch". Đồng thời Android cũng có một số điện thoại đẹp AsyncTask giúp bạn dễ dàng hơn.

Điều đó đang được nói, tôi không thấy lý do tại sao bạn không thể sử dụng lại handlerthread cho nhiều thành phần, miễn là bạn điều chỉnh quyền truy cập vào luồng và dọn dẹp nó đúng cách khi hoạt động của bạn bị phá hủy. Nếu tôi hiểu chính xác this post, chuỗi của bạn có thể tiếp tục chạy ngay cả khi tất cả các hoạt động của bạn bị chấm dứt vì quá trình của bạn có thể tiếp tục chạy. Để giải quyết vấn đề này, bạn có thể đặt chủ đề của mình làm chuỗi daemon. Các chuỗi Daemon sẽ tự động bị hủy khi chuỗi không phải daemon cuối cùng trong ứng dụng của bạn kết thúc.

BTW, cách khác bạn cũng có thể muốn xem xét việc sử dụng một ThreadPoolExecutor

+0

Tôi không đồng ý với ý kiến ​​của bạn, bởi vì nếu một điều mà bạn phải làm trên thread khác được thực hiện cho rất nhiều lần, sẽ tạo ra rất nhiều chủ đề , có thể sẽ làm hỏng ứng dụng. –

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