2012-12-20 36 views
75

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 tác vụ trên chuỗi giao diện người dùng trong Android ??runOnUiThread vs Looper.getMainLooper() đăng trong Android

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 mã hóa một cái gì đó trong một lớp không thể nhìn thấy Hoạt động (chẳng hạn như giao diện).

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

Cảm ơn,
R.

+4

Không có sự khác biệt ngoại trừ 'runOnUiThread' sẽ kiểm tra xem đó có phải là chuỗi giao diện người dùng và thực hiện tác vụ của bạn trực tiếp thay vì đăng nó dưới dạng' Message' – zapl

+1

Cảm ơn. Bạn vui lòng chuyển đổi nó thành câu trả lời, vì vậy tôi có thể chấp nhận nó? – Rich

+0

Ngoài ra, tôi đã viết một số mã để kiểm tra xem có điều gì đó đang được thực hiện trên chuỗi giao diện người dùng hay không, do đó sẽ rất đơn giản để bao gồm thủ công. – Rich

Trả lời

149

Sau đây cư xử như nhau khi gọi từ chủ đề nền

qua Looper.getMainLooper()

Runnable task = getTask(); 
    new Handler(Looper.getMainLooper()).post(task); 

qua Activity#runOnUiThread()

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

Các loại khác nha chỉ ference là khi bạn thực hiện đ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 Chủ đề hiện tại đã là chuỗi giao diện người dùng và sau đó thực hiện trực tiếp. Đăng nó dưới dạng tin nhắn sẽ trì hoãn việc thực hiện cho đến khi bạn trở về từ phương thức giao diện người dùng UI hiện tại.

Ngoài ra còn có cách thứ ba để thực hiện một số Runnable trên chuỗi giao diện người dùng sẽ là View#post(Runnable) - thư 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 View đã được xây dựng đúng cách và có bố cục trước khi mã được thực thi.

+2

Câu trả lời hay, cảm ơn! – Boy

Các vấn đề liên quan