Lý do
Để biết lý do vì sao dùng HandlerThread
, ta đi so sánh Thread
với HandlerThread
.
*
Thread
: Khi sử dụng Thread, ta chỉ có thể tạo một instance Thread
va chạy nó, nếu muốn chạy nhiều tác vụ, sẽ phải tạo nhiều instance Thread
và quá nhiều Thread
cùng chạy thì có khả năng ứng dụng sẽ load chậm, vì cpu bị quá tải số luồng có thể xử lý.*
HandlerThread
: Khắc phục nhược điểm của Thread
, có thể tái sử dụng Thread
để tránh gây quá tải Thread
.
Cách hoạt động
Ta sẽ có một hàng đợi các Task
, một Looper
, một Thread
. Looper
sẽ giữ cho Thread
sống và nó sẽ chạy lần lượt qua các Task
trong hàng đợi, Task
nào được chạy đến thì thực thi Task
đó trong Thread
và xóa Task
đó khỏi hàng đợi, hết Task
này thì đến Task
khác.
Chú ý:*
Task
mà nói ở trên là nhiệm vụ cần thực hiện, nói dễ hơn là đoạn code cần chạy.*
Cần giải phóng Thread
vào lúc thích hợp, chẳng hạn như đóng ứng dụng hoặc không thì Thread
sẽ chạy mãi mãi.
Tạo HandlerThread
Trong quá trình học, mình thấy có nhiều cách để tạo và sử dụng HandlerThread
, nhưng có một cách mình rất thích vì nó đơn giản và ngắn ngọn, chính là cách này:
Khi Looper gặp
Task` đó nó sẽ được thực thi.
1 | val handlerThread = HandlerThread("handlerThread") |
*
HandlerThread()
là một class
base từ Thread()
, nhưng nó có phương thức looper
, chứa hàng đợi Task
.*
Handler
là một class
có nhiệm vụ gửi các Task
tới hàng đợi Task
của Thread
từ Thread
khác (UI Thread
chẳng hạn)
Post một Task tới hàng đợi
Để post một Task
tới hàng đợi, chỉ việc:
1 | handler.post{ |
Giải phóng Thread
Để giải phóng Thread
, chỉ việc:
1 | handler.removeCallbacks(handlerThread) |
Viết App
Một app đơn giản sử dụng HandlerThread
:
1 | class MainActivity : AppCompatActivity() { |
URL QR