runOnUiThread vs Looper.getMainLooper (). post trong Android


99

Bất cứ ai có thể cho tôi biết nếu có bất kỳ sự khác biệt nào giữa việc sử dụng runOnUiThread () so với Looper.getMainLooper (). Post () để thực thi một tác vụ trên chuỗi giao diện người dùng trong Android không ??

Về điều duy nhất tôi có thể xác định là vì runOnUiThread là một phương thức Hoạt động không tĩnh, Looper.getMainLooper (). Post () thuận tiện hơn khi bạn cần viết mã thứ gì đó trong một lớp không thể nhìn thấy Hoạt động (chẳng hạn như một giao diện).

Tôi không tìm kiếm một cuộc thảo luận về MÀ điều gì đó nên được thực thi trên chuỗi giao diện người dùng, tôi hiểu rằng một số thứ không thể và rất nhiều thứ không nên, tuy nhiên, một số thứ (như khởi động AsyncTask) PHẢI được thực thi từ chuỗi giao diện người dùng.

Cảm ơn,
R.


6
Không có sự khác biệt ngoại trừ việc runOnUiThreadsẽ kiểm tra nếu nó đã là thread UI và thực hiện nhiệm vụ của bạn trực tiếp thay vì gửi bài nó như là mộtMessage
zapl

1
Cảm ơn. Bạn vui lòng chuyển câu trả lời đó thành câu trả lời để tôi có thể chấp nhận được không ??
Phong phú

Ngoài ra, tôi đã viết một số mã để kiểm tra xem có thứ gì đó đang được thực thi trên chuỗi giao diện người dùng hay không, vì vậy sẽ rất đơn giản để đưa vào theo cách thủ công.
Giàu

Câu trả lời:


192

Các hành vi sau đây hoạt động tương tự khi được gọi từ các chuỗi nền:

  • sử dụng Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
  • sử dụng Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);

Sự khác biệt duy nhất là khi bạn làm điều đó từ chuỗi giao diện người dùng kể từ

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

sẽ kiểm tra xem Luồng hiện tại đã là luồng giao diện người dùng chưa và sau đó thực thi trực tiếp. Đăng nó dưới dạng tin nhắn sẽ trì hoãn việc thực thi cho đến khi bạn quay lại từ phương thức UI-thread hiện tại.

Ngoài ra còn có một cách thứ ba để thực thi một Runnablechuỗi giao diện người dùng View#post(Runnable)- cách này sẽ luôn đăng thông báo ngay cả khi được gọi từ chuỗi giao diện người dùng. Điều đó rất hữu ích vì điều đó sẽ đảm bảo rằng Viewtệp đã được xây dựng đúng cách và có bố cục trước khi mã được thực thi.

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.