Android Studio切换主线程的两种方式详解

 更新时间:2025年07月24日 09:49:44   作者:剑客狼心  
在Android中,UI操作必须在主线程中进行,不能直接在子线程中更新 UI,今天介绍两种Android Studio子线程切换回主线程的方法,需要的朋友可以参考下

在 Android 中,UI 操作必须在主线程中进行,不能直接在子线程中更新 UI。今天介绍两种在子线程切换回主线程的方法。

runOnUiThread()Handler.post() 都可以用于切换到 主线程(UI 线程) 执行任务,主要用于 更新 UI。但它们在使用方式、作用范围、底层实现上有所不同。

1. runOnUiThread()

runOnUiThread()Activity 的一个方法,它可以让任务在 主线程(UI 线程) 执行。适用于Activity 内部 从子线程切换到主线程 以更新 UI。

用法:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        textView.setText("更新 UI");
    }
});

Lambda 写法:

runOnUiThread(() -> textView.setText("更新 UI"));

底层原理:

runOnUiThread() 的实现本质上 使用了 Handler.post(),它会获取 Activity 绑定的 Looper,然后将任务投递到 主线程消息队列

适用场景

  • 只在 Activity 里使用,不能在 ServiceBroadcastReceiver 等组件中用。
  • 简单的 UI 更新,比如在 onCreate()、网络请求回调、异步任务完成后 更新 TextView、Button 等 UI 组件

完整的代码:实现的效果很简单,2秒后在主界面更新UI,显示 "UI 更新成功!"

public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main9);

        textView = findViewById(R.id.textView);

        // 在子线程中执行耗时操作
        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("UI 更新成功!");
                    }
                });
            }
        }).start();
    }
}

2. Handler.post()

Handler.post() 通过 Handler 将任务投递到指定的线程,一般用于 从子线程切换到主线程 处理 UI 更新,也可以用于子线程间通信。

Handler handler = new Handler(Looper.getMainLooper());
handler.post(() -> textView.setText("更新 UI"));

底层原理

  • Handler 通过 MessageQueue 投递任务Looper 取出并执行。
  • 不会判断当前线程,即使 post() 发生在主线程,它也会把任务加入消息队列,可能稍微延迟执行。

适用场景

  • 适用于 所有 Android 组件ActivityServiceFragmentBroadcastReceiver)。
  • 可以执行延迟任务postDelayed())。
  • 可在子线程和子线程间通信,不仅限于 UI 更新。

完整代码,实现的效果和上面runOnUiThread()是一样的。2秒延迟后,主界面显示"数据加载完成"

import android.os.Handler;
import android.os.Looper;

public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main9);

        textView = findViewById(R.id.textView);

        Handler handler = new Handler(Looper.getMainLooper());
        new Thread(() -> {
            try {
                Thread.sleep(2000); // 模拟网络请求
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.post(() -> textView.setText("数据加载完成"));
        }).start();

    }
}

到此这篇关于Android Studio切换主线程的两种方式详解的文章就介绍到这了,更多相关Android Studio切换主线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android Map新用法:MapFragment应用介绍

    Android Map新用法:MapFragment应用介绍

    MapView ,MapActivity 这种的局限在于,必须要继承MapActivity,否则无法使用MapView,但是,MapFragment 这种的局限在于,必须要安装Google Play Service ,也就是说必须是原生rom。而且sdk要在12以上
    2013-01-01
  • Android 曲线图的绘制示例代码

    Android 曲线图的绘制示例代码

    本篇文章主要介绍了Android 曲线图的绘制示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Android IPC机制ACtivity绑定Service通信代码实例

    Android IPC机制ACtivity绑定Service通信代码实例

    这篇文章主要介绍了Android IPC机制ACtivity绑定Service通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Android获取屏幕或View宽度和高度的方法

    Android获取屏幕或View宽度和高度的方法

    这篇文章主要介绍了Android获取屏幕或View宽度和高度的方法,涉及Android针对手机屏幕的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-02-02
  • NestScrollView嵌套RecyclerView实现淘宝首页滑动效果

    NestScrollView嵌套RecyclerView实现淘宝首页滑动效果

    这篇文章主要介绍了NestScrollView嵌套RecyclerView实现淘宝首页滑动效果,主要实现淘宝首页嵌套滑动,中间tab吸顶效果,以及介绍NestScrollView嵌套RecyclerView处理滑动冲突的方法,需要的朋友可以参考下
    2021-12-12
  • Android创建悬浮窗的完整步骤

    Android创建悬浮窗的完整步骤

    这篇文章主要给大家介绍了关于Android创建悬浮窗的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Android Gradle多渠道打包的实现方法

    Android Gradle多渠道打包的实现方法

    这篇文章主要介绍了Android Gradle多渠道打包的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Kotlin Flow常用封装类StateFlow使用详解

    Kotlin Flow常用封装类StateFlow使用详解

    这篇文章主要为大家介绍了Kotlin Flow常用封装类StateFlow使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 浅谈Android Classloader动态加载分析

    浅谈Android Classloader动态加载分析

    这篇文章主要介绍了浅谈Android Classloader动态加载分析,详细的介绍了ClassLoader概念、分类,具有一定的参考价值,有兴趣的可以了解一下
    2018-03-03
  • Android实现倒计时结束后跳转页面功能

    Android实现倒计时结束后跳转页面功能

    最近在工作中遇到一个需求,需要在倒计时一段时间后进行跳转页面,通过查找相关资料发现其中涉及的知识还不少,所以分享出来,下面这篇文章主要给大家介绍了关于Android实现倒计时结束后跳转页面功能的相关资料,需要的朋友可以参考下。
    2017-11-11

最新评论