2012-01-18 35 views
9

Tôi luôn tạo hai trình xử lý: một trình bao bọc trên chủ đề chính, một trình bao bọc trên một sợi đơn.Đây có phải là cách để ngăn chặn handlerthread?

Đây có phải là phương pháp tốt nhất để bắt đầu và dừng các hoạt động này trong vòng đời Hoạt động không?

HandlerThread safeThread = null; 
Handler safeHandler = null; 
Handler handler = null; 


@Override 
    public void onStart() { 

if (safeThread == null) { 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.NEW) { 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.WAITING) { 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.TERMINATED) { 
      safeThread = null; 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } 
} 




protected void onStop() { 
     Log.d("x", "onStop is executed"); 
     safeHandler = null; 
     safeThread.quit(); 
     safeThread.interrupt(); 
     safeThread = null; 
     super.onStop(); 
    } 
+0

safeThread.interrupt(); là cách tốt nhất để ngăn chặn thread – Sameer

+0

có, tôi biết nhưng tôi nghĩ về điều này là an toàn khi tôi sau khi ngắt và null này. – rex

+1

tôi đã đưa ra câu trả lời .. một điều tôi sẽ đề nghị bạn là bạn mới trên stackoverflow.IF bạn muốn đánh giá cao một người nào đó giúp sau đó cho anh ta một phiếu bầu và nếu bạn nghĩ rằng câu trả lời là tốt nhất thì đánh dấu nó là câu trả lời .. :) cổ vũ – Sameer

Trả lời

0

Bạn có thể sử dụng như là một cách an toàn để ngăn chặn chủ đề:

if (safeThread!= null) { 
    Thread moribund = safeThread; 
    safeThread = null; 
    moribund.interrupt(); 
} 
+1

Để biết thêm chi tiết, hãy xem http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class – Sameer

+0

này bạn có thể giải thích thêm chi tiết không ?? vì lý do gì ?? – rex

+0

Vì lý do, hãy xem câu hỏi trong nhận xét trên của tôi – Sameer

15

Tôi biết đó là một câu hỏi hơi cũ, nhưng tôi vấp ngã trên nó tìm kiếm các câu trả lời tương tự và tiếp tục nghiên cứu tôi don' t tin rằng câu trả lời hiện tại áp dụng rất tốt cho HandlerThread (mặc dù hoàn toàn chính xác cho các chủ đề bình thường)

HandlerThread has builtin quit()quitSafely (API18) phương pháp để ngăn chặn các chủ đề. https://developer.android.com/reference/android/os/HandlerThread.html#quit()

sự khác biệt giữa hai chỉ khi các thư trong hàng đợi sẽ được xử lý trước khi nó dừng hay không.

như vậy để trả lời, nó đơn giản như:

safeThread.quit(); 
+0

Để thêm sự rõ ràng: quit() có sẵn trong API 5 – Vyrx

+2

Phải làm gì trước api 18? – JohnyTex

+0

Không quit() hoặc quitSafely() dừng Thread hoặc chỉ Looper mà thread phải xử lý tin nhắn? Nó không giải thích nếu nó kết thúc thread hay không [ở đây] (https://developer.android.com/reference/android/os/HandlerThread.html#quit()). – Thracian

8

Nếu bạn bắt đầu thread như thế này:

HandlerThread thread = new HandlerThread("MyHandlerThread"); 
thread.start(); 

Cách an toàn nhất để ngăn chặn nó sẽ là:

thread.quitSafely(); 

quitSafely đảm bảo rằng tất cả thư đang chờ xử lý được xử lý trước chuỗi dừng lại.

Lưu ý: câu trả lời ban đầu của tôi bao gồm một cuộc gọi bổ sung cho Thread.Join, nhưng tôi thấy các tham gia cuộc gọi không phát hành đáng tin cậy khi sử dụng sau khi quitSafely.

+0

Tôi cũng tự hỏi liệu tôi có cần tham gia sau khi quitSafely hay không. Bạn có thể làm rõ "không phát hành đáng tin cậy" không? Cảm ơn! – Kaifei

+0

@Kaifei Tôi nhớ lại tôi đã quan sát rằng cuộc gọi tham gia chỉ chặn luồng. Đó là vào tháng Tám, vì vậy không chắc chắn 100%. – SharkAlley

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