Tôi cần kiểm tra xem luồng chạy một đoạn mã nhất định có phải là luồng chính (UI) hay không. Làm thế nào tôi có thể đạt được điều này?
Tôi cần kiểm tra xem luồng chạy một đoạn mã nhất định có phải là luồng chính (UI) hay không. Làm thế nào tôi có thể đạt được điều này?
Câu trả lời:
Looper.myLooper() == Looper.getMainLooper()
nếu điều này trả về đúng, thì bạn đang ở trên giao diện người dùng!
bạn có thể sử dụng mã dưới đây để biết chủ đề hiện tại có phải là UI / Chủ đề chính hay không
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
hoặc bạn cũng có thể sử dụng cái này
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
sẽ trả về null nếu luồng không được liên kết với Looper. Vì vậy, cả hai đều an toàn và có cùng kết quả, nhưng cái đầu tiên chậm hơn một chút trong khi nó tìm kiếm bên trong bản đồ để tìm ra kẻ lừa đảo và chủ đề liên quan của nó và làm một số thứ khác.
Cách tốt nhất là cách rõ ràng nhất, mạnh mẽ nhất: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Hoặc, nếu nền tảng thời gian chạy là API cấp 23 (Marshmallow 6.0) trở lên:
Looper.getMainLooper().isCurrentThread()
Xem API Looper . Lưu ý rằng gọi điện Looper.getMainLooper()
liên quan đến đồng bộ hóa (xem nguồn ). Bạn có thể muốn tránh chi phí bằng cách lưu trữ giá trị trả về và sử dụng lại nó.
* tín dụng greg7gkb và 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, mà tôi nghĩ là ít rõ ràng. Tôi tín dụng greg7gkb.
equals
và do đó rơi trở lại ==
, nhưng điều đó có thể thay đổi trong tương lai. Vì vậy, tôi đã sửa câu trả lời.
Tóm tắt các giải pháp, tôi nghĩ đó là giải pháp tốt nhất:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
Và, nếu bạn muốn chạy một cái gì đó trên luồng UI, bạn có thể sử dụng cái này:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Bạn có thể kiểm tra
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
Cho phép tôi mở đầu điều này bằng: Tôi thừa nhận bài đăng này có thẻ 'Android', tuy nhiên, tìm kiếm của tôi không liên quan gì đến 'Android' và đây là kết quả hàng đầu của tôi. Cuối cùng, đối với những người dùng Java SO không phải Android đổ bộ vào đây, đừng quên:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
Sau khi thiết lập điều này, ở nơi khác trong mã của bạn, bạn có thể dễ dàng kiểm tra xem bạn có thực hiện trên luồng chính bằng:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Một chút xấu hổ tôi đã tìm kiếm trước khi nhớ điều này, nhưng hy vọng nó sẽ giúp người khác!
bạn có thể xác minh nó trong logcat ddms android trong đó id quá trình sẽ giống nhau nhưng id luồng sẽ khác nhau.
Bạn có thể thử Thread.cienThread (). IsDaemon ()