Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android Studio切换主线程

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

作者:剑客狼心

在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,然后将任务投递到 主线程消息队列

适用场景

完整的代码:实现的效果很简单,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"));

底层原理

适用场景

完整代码,实现的效果和上面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切换主线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文