Android Activity api 详解 - runOnUiThread

概述

android规定不能在子线程中对ui进行操作,但开发中经常会遇到子线程经过一些逻辑操作之后要马上对ui进行操作的情况,传统方法是执行Handler,使执行进程由子线程进入主线程中,然后就可以对ui进行操作:

mButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        new Thread(new Runnable() {  
            @Override
            public void run() { // 子线程
                Message message = new Message();
                Bundle bundle = new Bundle();
                bundle.putString("ChangeUI", "Handler改变了ui");
                message.setData(bundle);
                handler.sendMessage(message);
            }
        }).start();
    }
});
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        Bundle bundle = msg.getData();
        String str = bundle.getString("ChangeUI");
        mUiTextview.setText(str);

    }
};

为了改变ui就要写这么多代码,非常不便捷,其实Activity中有个方法:runOnUiThread 就是为了更便捷的执行子线程时对ui进行操作。

mButton2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        new Thread(new Runnable() {
            @Override
            public void run() { // 子线程
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mUiTextview.setText("runOnUiThread改变了ui");
                    }
                }); 
            }
        }).start();

    }
});

有效代码是这部分:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        mUiTextview.setText("runOnUiThread改变了ui");
    }
}); 

是不是快捷多了。

那么 runOnUiThread 为什么可以在子线程中执行ui操作?

由 runOnUiThread 源码很容易找到答案:

Android Activity api 详解 - runOnUiThread_第1张图片

由源码可知:
当前不是ui线程(即不是主线程)时,把 action 抛进 Message 队列等待主线程到来;当前是ui线程(即是主线程)时就执行ui操作。

源码点击此处下载

你可能感兴趣的:(Android)