android使用handler ui线程和子线程通讯更新ui示例


在Android开发中,`Handler` 是用于在不同线程之间发送和处理消息(或Runnable对象)的一种机制,常用于子线程更新UI线程(即主线程)中的UI元素。以下是一个简单的示例,展示了如何在子线程中使用 `Handler` 来更新UI线程中的TextView内容。

首先,你需要在你的Activity或Fragment中定义一个Handler对象,这个Handler对象会与UI线程的Looper相关联,确保它能在UI线程中执行代码。


public class MainActivity extends AppCompatActivity {

    private TextView textView;

    // 定义Handler对象
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // 在这里处理消息,更新UI
            if (msg.what == 1) {
                String text = (String) msg.obj;
                textView.setText(text);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);

        // 启动一个子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 模拟耗时操作
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // 创建消息
                Message message = Message.obtain();
                message.what = 1;
                message.obj = "这是从子线程发送的消息";

                // 发送消息到Handler,Handler会在UI线程中处理这个消息
                handler.sendMessage(message);
            }
        }).start();
    }
}

在这个示例中,我们首先定义了一个匿名内部类的Handler,它重写了 `handleMessage` 方法来更新TextView的内容。然后,在 `onCreate` 方法中,我们找到了TextView控件,并启动了一个新的线程来模拟耗时操作(例如网络请求)。当耗时操作完成后,我们创建了一个Message对象,设置了它的what字段和obj字段(分别代表消息类型和消息内容),并通过Handler的 `sendMessage` 方法发送这个消息。Handler接收到消息后,会在UI线程中调用 `handleMessage` 方法来处理这个消息,从而安全地更新TextView的内容。

注意:从Android 10(API级别29)开始,官方推荐使用 `Kotlin` 协程(Coroutine)和 `LiveData`、`ViewModel` 等架构组件来处理异步任务和UI更新,因为它们提供了更简洁、更强大的异步编程模型。然而,对于需要了解或维护旧有代码库的情况,了解 `Handler` 的使用仍然是很重要的。