Làm cách nào để phát hiện giao diện người dùng trên Android?


117

Có cách nào mạnh mẽ để phát hiện nếu Thread.currentThread()là luồng UI hệ thống Android trong một ứng dụng không?
Tôi muốn đặt một số xác nhận trong mã mô hình của mình để khẳng định rằng chỉ một luồng ( ví dụ luồng ui) truy cập trạng thái của tôi, để đảm bảo rằng không cần loại đồng bộ hóa nào.


Xem câu trả lời của tôi ở đây: stackoverflow.com/a/41280460/878126
nhà phát triển Android

Câu trả lời:


199

Thực tiễn phổ biến để xác định danh tính của UI UI thông qua Looper # getMainLooper :

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

Từ API cấp 23 trở lên, có một cách tiếp cận dễ đọc hơn một chút bằng cách sử dụng phương thức trợ giúp mới làC HiệnThread trên bộ xử lý chính:

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

6
stackoverflow.com/questions/11411022/ Từ Câu trả lời này cũng rất hay)
UnknownJoe 6/214

44

Tôi nghĩ rằng cách tốt nhất là đây:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

Công trình tuyệt vời. Cảm ơn bạn!
Hồng

3
Không cần sử dụng equalsvì chúng tôi chỉ so sánh các tài liệu tham khảo và trên hết, cả hai đều tĩnh.
mr5

8

Khi cấp API 23, Loopercó một phương thức trợ giúp tốt isCurrentThread. Bạn có thể lấy mainLoopervà xem nếu nó là một cho chủ đề hiện tại theo cách này:

Looper.getMainLooper().isCurrentThread()

Nó thực tế giống như:

Looper.getMainLooper().getThread() == Thread.currentThread()

nhưng nó có thể dễ đọc hơn một chút và dễ nhớ hơn.



2

Bên cạnh việc kiểm tra looper , nếu bạn đã từng cố gắng đăng xuất id luồng onCreate(), bạn có thể tìm thấy id của luồng UI (luồng chính) luôn bằng 1. Do đó

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}

Tôi không thể tìm thấy bất kỳ tài liệu chính thức nào chứng thực rằng điều này là đúng và sẽ luôn như vậy. Bạn có một liên kết?
intrepidis

Đây là những gì tôi tìm thấy trong logcat khi tôi muốn theo dõi hành vi đa luồng. Bạn có thể thử xuất id luồng
yushulx

8
Tôi thực sự khuyên bạn nên chống lại điều này, vì giá trị này có thể dành riêng cho thiết bị và / hoặc phiên bản Android của bạn. Ngay cả khi đó là trường hợp trên mọi thiết bị Android ngay bây giờ, không có gì đảm bảo rằng nó sẽ tiếp tục là trường hợp trong các phiên bản sau. Lưu ID luồng trong một thành viên lớp khi chạy onCreate () có vẻ hợp lý hơn với tôi một chút.
personne3000

1

Bạn không thể sử dụng runOnUiThreadphương thức trong Activitylớp sao? Xem ..

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29


4
Ứng dụng của tôi đang hoạt động, nhưng, nó có một vài tác giả và đang trở nên khá lớn và phức tạp. Những gì tôi muốn làm là thêm một mạng lưới an toàn bổ sung, một khẳng định sẽ nắm bắt được sai lầm nếu ai đó đang gọi một phương thức được thiết kế để chỉ được gọi từ luồng GUI từ một luồng khác.
ParDroid

Tôi hiện đang sửa một lỗi trong đó sử dụng runOnUiThread khiến UX flash.
fobbymaster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.