Android Activity api 详解 - runOnUiThread
16lz
2021-01-23
概述
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 源码很容易找到答案:
由源码可知:
当前不是ui线程(即不是主线程)时,把 action 抛进 Message 队列等待主线程到来;当前是ui线程(即是主线程)时就执行ui操作。
源码点击此处下载
更多相关文章
- Android之怎么操作文件(读写以及保存到sdcard)
- 1.活用Android线程间通信的Message机制
- 在Visual Studio 2013/2015上使用C#开发Android/IOS安装包和操作
- Android使用SQLiteDatabase操作SQLite数据库