Activity.runOnUiThread方法理解,你学会了吗?

开发 前端
在Android中,UI线程是负责处理UI相关的事件和更新UI的。如果在非UI线程中直接更新UI,会导致应用程序崩溃或出现其他不可预知的问题。runOnUiThread 提供了一种从非UI线程更新UI的方式,确保UI操作在UI线程中执行。

runOnUiThread 是Android开发中一个重要的方法,可以在非UI线程中切换到UI线程来执行一些UI相关的操作。

作用与用途

  • 「更新UI」:在Android中,UI线程是负责处理UI相关的事件和更新UI的。如果在非UI线程中直接更新UI,会导致应用程序崩溃或出现其他不可预知的问题。runOnUiThread 提供了一种从非UI线程更新UI的方式,确保UI操作在UI线程中执行。
  • 「保持线程安全」:使用 runOnUiThread,可以确保在多线程环境下,UI的更新是线程安全的。

原理解析

Activity源码中runOnUiThread方法:

final Handler mHandler = new Handler();
private Thread mUiThread;
// ...
public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
     } else {
         action.run();
     }
// ...
}
  • 「Handler机制」:runOnUiThread 的原理基于Android的 Handler 机制。当调用 runOnUiThread 时,如果当前线程是UI线程,则直接执行传入的 Runnable 的 run 方法。如果当前线程不是UI线程,会将 Runnable 对象封装成一个 Message 对象,并将其发送到UI线程的消息队列中。
  • 「消息队列」:UI线程中有一个消息队列(MessageQueue),用于存储待处理的消息。当UI线程空闲时,会从消息队列中取出消息并执行。
  • 「Looper」:UI线程中还有一个 Looper 对象,负责不断地从消息队列中取出消息并执行。当调用 Handler 的 post 方法或 sendMessage 方法时,实际上是将任务发送到 Looper 的消息队列中。

使用示例

  • 「调用方式」:runOnUiThread 是 Activity 类中的一个方法,只能在 Activity 或 Fragment 中使用。
  • 「参数」:runOnUiThread 接受一个 Runnable 参数。在 Runnable 的 run 方法中编写需要在UI线程中执行的代码。
public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        textView = findViewById(R.id.tv_test);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // 更新UI
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("更新后的文本");
                    }
                });
            }
        }).start();
    }
}

注意事项

  • 「只能在Activity或Fragment中使用」:由于 runOnUiThread 是 Activity 类的方法,因此只能在 Activity 或 Fragment 的上下文中使用。
  • 「避免频繁调用」:runOnUiThread 提供了方便的线程切换方式,频繁地从非UI线程切换到UI线程会增加线程切换的开销,影响应用的性能。
  • 「确保线程安全」:在使用 runOnUiThread 时,需要确保传递的 Runnable 对象是线程安全的,以避免出现竞态条件等线程安全问题。

责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2024-02-02 09:00:14

内存泄漏对象

2023-11-07 08:19:35

IO多路复用磁盘、

2024-02-04 00:00:00

Effect数据组件

2024-01-19 08:25:38

死锁Java通信

2023-01-10 08:43:15

定义DDD架构

2023-07-26 13:11:21

ChatGPT平台工具

2023-08-01 12:51:18

WebGPT机器学习模型

2024-01-02 12:05:26

Java并发编程

2024-01-10 07:38:08

2022-07-26 00:25:57

PandasQuery索引器

2023-07-31 07:33:05

JVM调优Full GC

2024-11-11 00:00:00

getHTML()DOM结构

2023-12-07 07:03:09

2024-02-29 13:12:30

2024-10-31 09:15:09

2024-07-31 08:39:45

Git命令暂存区

2022-07-08 09:27:48

CSSIFC模型

2023-12-12 08:02:10

2023-01-30 09:01:54

图表指南图形化

2024-08-06 09:47:57

点赞
收藏

51CTO技术栈公众号