Đã có một số câu hỏi liên quan đến việc sử dụng thích hợp Threads
so với Handlers
so với AsyncTask
. (như here & here)Có bất kỳ tác động thực sự thực sự nào của Trình xử lý và Chủ đề không?
Các câu hỏi đó giải quyết tốt nhất câu hỏi khi nào nên sử dụng cái gì. Câu hỏi của tôi là nhiều hơn về ý nghĩa hiệu suất trong một số trường hợp nhất định.
Ví dụ, tôi thường thấy người khác viết mã trong đó họ sử dụng Threads
chỉ đơn giản là để có thể lên lịch thực hiện mã cho tương lai. Bất cứ khi nào, tôi thấy điều này, tôi theo bản năng cảm thấy như refactoring mã để sử dụng một Handler
và chỉ là một bài bị trì hoãn runnable
.
Dưới đây là ví dụ trong đó Chủ đề được sử dụng để cập nhật thanh tìm kiếm cho một số phương tiện đang phát với mediaplayer
và sau đó là cách tôi sẽ thực hiện.
những gì tôi nhìn thấy rất nhiều:
if (positionTracker != null && positionTracker.isAlive()
&& !positionTracker.isInterrupted()) {
return;
}
positionTracker = new Thread(new Runnable() {
public void run() {
int currentPosition = 0;
int total = player.getDuration();
while (player != null && CurrentPosition < total) {
try {
Thread.sleep(1000);
currentPosition = player.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
if (someListener != null) {
someListener.onEvent();
}
}
}
}, "position tracker thread");
positionTracker.start();
Và cách tôi muốn làm điều đó:
Runnable trackPositionRunnable = new Runnable() {
@Override
public void run() {
currentPosition = player.getCurrentPosition();
if (someListener != null) {
someListener.onEvent();
mHandler.postDelayed(this, 1000);
}
}
};
mHandler.post(trackPositionRunnable);
Rõ ràng, cách ưa thích của tôi là một chút dễ dàng hơn để đọc và nhiều hơn nữa ngắn gọn. Nhưng ý nghĩa hiệu suất là gì? Là một cách tốt hơn phương pháp, về hiệu suất, hơn khác? Nếu vậy, tại sao?
Cảm ơn! Vì vậy, bạn đang nói khi đồng bộ hóa bắt đầu là một vấn đề mà bạn thực sự không thể tránh sử dụng các luồng/dịch vụ, nhưng đối với các tác vụ nhỏ như ví dụ của tôi, một trình xử lý có lẽ là cách đơn giản nhất? – LuxuryMode
Tôi muốn nói nó hơi khác. Di chuyển mọi thứ tốn thời gian ra khỏi chuỗi giao diện người dùng. Giữ giao diện người dùng chi phí thấp trên luồng giao diện người dùng chính. Hãy nhớ rằng việc đăng bài trong nhiều HandlerThread là một bước tiếp theo hợp lý sạch sẽ; giao diện bài đăng là cách sạch sẽ để yêu cầu mọi thứ và một số lượng nhỏ chuỗi công việc có thể không đồng bộ đủ. Tuy nhiên, hãy lưu ý đến việc đảm bảo tất cả các hoạt động giao diện người dùng của bạn diễn ra trên chuỗi giao diện người dùng chính. –
Đối với "chuyển đổi trên không": vì có một chuỗi chạy trong mọi trường hợp, tôi thấy không có sự khác biệt. Chuỗi "được xử lý" cũng sẽ được chuyển vào và ra như bất kỳ luồng thông thường nào khác. –