Tôi có một chuỗi công nhân nằm ở chế độ nền, xử lý tin nhắn. Một cái gì đó như thế này:
class Worker extends Thread {
public volatile Handler handler; // actually private, of course
public void run() {
Looper.prepare();
mHandler = new Handler() { // the Handler hooks up to the current Thread
public boolean handleMessage(Message msg) {
// ...
}
};
Looper.loop();
}
}
Từ chuỗi chính (chuỗi giao diện người dùng, không quan trọng), tôi muốn làm điều gì đó như sau:
Worker worker = new Worker();
worker.start();
worker.handler.sendMessage(...);
Vấn đề là điều này đặt ra cho tôi một điều kiện chạy đua đẹp: tại thời điểm worker.handler
được đọc, không có cách nào để chắc chắn rằng chuỗi công nhân đã được chỉ định cho trường này!
Tôi không thể chỉ đơn giản tạo ra Handler
từ hàm tạo của Worker
', bởi vì hàm tạo chạy trên luồng chính, vì vậy Handler
sẽ liên kết chính nó với luồng sai.
Đây dường như là một kịch bản không phổ biến. Tôi có thể nghĩ ra một số cách giải quyết, tất cả chúng đều xấu xí:
Một cái gì đó như thế này:
class Worker extends Thread { public volatile Handler handler; // actually private, of course public void run() { Looper.prepare(); mHandler = new Handler() { // the Handler hooks up to the current Thread public boolean handleMessage(Message msg) { // ... } }; notifyAll(); // <- ADDED Looper.loop(); } }
Và từ chủ đề chính:
Worker worker = new Worker(); worker.start(); worker.wait(); // <- ADDED worker.handler.sendMessage(...);
Nhưng điều này cũng không đáng tin cậy: nếu điều này
notifyAll()
xảy ra trướcwait()
, thì chúng ta sẽ không bao giờ bị đánh thức!Chuyển một ký tự đầu tiên
Message
cho hàm tạoWorker
của ', córun()
phương thức đăng nó. Một giải pháp đặc biệt, sẽ không hoạt động cho nhiều thư hoặc nếu chúng tôi không muốn gửi ngay nhưng phải gửi ngay sau đó.Bận-chờ cho đến khi
handler
ruộng không cònnull
. Đúng, phương sách cuối cùng ...
Tôi muốn tạo Handler
và MessageQueue
thay mặt cho Worker
chuỗi, nhưng điều này dường như không thể thực hiện được. Cách thanh lịch nhất trong số này là gì?
HandlerThread
?