Android --- Handler的用法,子线程中怎么切线程进行更新UI

我们都知道耗时操作需要放到子线程去操作,那我们可以new一个Thread来进行耗时操作,但是更新UI需要在主线程,就涉及到线程之间的切换,该如何处理呢?如下:


你可以通过使用 Handler 与 Looper.getMainLooper() 来创建一个主线程的 Handler,然后发送消息或 Runnable 到主线程执行。

java 复制代码
// 创建一个 Handler,绑定到主线程的 Looper
Handler mainHandler = new Handler(Looper.getMainLooper());

// 在子线程中执行任务,然后切换到主线程更新 UI
new Thread(new Runnable() {
    @Override
    public void run() {
        // 执行一些耗时操作

        // 使用 Handler 切换到主线程更新 UI
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                // 在主线程中更新 UI
                // 例如更新 TextView 或其他 UI 元素
                textView.setText("更新 UI");
            }
        });
    }
}).start();

解释:

Looper.getMainLooper():获取主线程的 Looper,Handler 会绑定到这个 Looper,这样它就可以将消息投递到主线程。

mainHandler.post(Runnable):这个方法将一个 Runnable 任务发送到主线程执行。


另一种方法:通过 Activity 或 View 的 post 方法

你也可以直接在 Activity 或 View 上调用 post 方法,将任务切换到主线程:

java 复制代码
// 直接在 UI 控件上执行任务
textView.post(new Runnable() {
    @Override
    public void run() {
        // 在主线程中执行
        textView.setText("更新 UI");
    }
});

这种方式不需要手动创建 Handler,它会自动将任务切换到主线程。


runOnUiThread 最后一种:

java 复制代码
// 在子线程中执行耗时操作,然后切换到主线程更新 UI
new Thread(new Runnable() {
    @Override
    public void run() {
        // 执行一些耗时操作

        // 使用 runOnUiThread 切换到主线程更新 UI
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 在主线程中更新 UI
                textView.setText("更新 UI");
            }
        });
    }
}).start();

解释:

runOnUiThread():这是 Activity 类的一个方法,它接受一个 Runnable 对象作为参数,并在主线程中执行该 Runnable 内的代码。

这种方法适用于在 Activity 中直接操作 UI 时,尤其是在子线程中执行耗时操作后需要更新 UI 的场景。


相关推荐
hunterandroid7 分钟前
[Android 从零到一] Compose LazyColumn 性能优化:key、稳定性与重组治理
android·前端
pengyu15 分钟前
【Kotlin 协程修仙录 · 元婴境 · 中阶】 | 操作符真解:Flow 中间操作符与数据流变幻术
android·kotlin
pengyu1 小时前
【Kotlin 协程修仙录 · 元婴境 · 初阶】 | 冷流初啼:Flow 的基础与响应式编程的入门
android·kotlin
wawo002 小时前
Kuikly实践-从Android compose迁移到kuikly compose
android
Carson带你学Android4 小时前
Android 版 MCP 正式登场:AppFunctions
android·ai编程·jetbrains
古法安卓6 小时前
Android-Direct Boot 阶段与 getFilesDir() 路径变更问题深度分析
android·java·android studio
阿巴斯甜7 小时前
Android Studio Detekt 使用
android
杉氧7 小时前
Flutter 跨平台多端适配与 Android/iOS 一键自动化打包发布
android·前端·flutter
Super 含8 小时前
Android 包体积优化(一):APK 到底大在哪里?从 APK 结构到体积分析
android·ide·vscode
Super 含8 小时前
Android 包体积优化(四):深入 ReDex——StripDebugInfo、InterDex 与 DEX 重排
android