2.4 Communicating with the UI Thread

来源:互联网 发布:秘鲁地震预警软件 编辑:程序博客网 时间:2024/05/16 12:22

1. 子线程给UI Thread传message

子线程只需要把message发到UI Thread的message queue中即可。message传到UI Thread是通过UI Thread的Looper操作的,而UI Thread Looper在应用中可以通过Looper.getMainLooper()方法全局访问到,因此使用类似下面的方式就能把子线程的message传到UI Thread:

// 把Task message发到UI ThreadRunnable task = new Runnable() { ... };new Handler(Looper.getMainLooper()).post(task);

2. UI Thread自己内部传message

因为本身是在UI Thread内,默认就是UI Thread Looper,因此可以直接传message
Eg:

// Method called on UI Threadprivate void postFromUiThreadToUiThread() {    new Handler().post(new Runnable() { ... });    // The code at this point is part of a message being processed and is executed before the posted message    // 翻译:此处的代码也是将被处理的message的一部分,它会在posted message之前被执行。}

3. Activity中使用runOnUiThread()

如果在Activity中执行的话,可以直接调用Activity.runOnUiThread(Runnable)方法。
Eg:

// Method called on UI Theadprivate void postFromUiThreadToUiThread() {    runOnUiThread(new Runnable() { ... });    // The code at this point is executed after the message.    // 翻译:此处的代码会在message之后被执行。}

注意2和3中new Handler().post()与runOnUiThread()处理message的时间和其之后的代码执行时间顺序的不同之处

4. 自定义一个类似runOnUiThread()方法

因为runOnUiThread()方法只能用在Activity类中,我们在Application子类中自定义一个类似runOnUiThread()的方法,让它把message插入到UI Thread的message queue中。
Eg:

public class MyApplication extends Application {    private long mUiThreadId;    private Handler mUiHandler;    @Override    public void onCreate() {        super.onCreate();        mUiThreadId = Thread.currentThread().getId();        mUiHandler = new Handler();    }    // 自定义一个类似runOnUiThread()的方法    public void customRunOnUiThread(Runnable runnable) {        if (Thread.currentThread().getId() != mUiThreadId) {            mUiHandler.post(runnable);        } else {            runnable.run();        }    }}
原创粉丝点击