Message事实更新UI

本文介绍了一种在Android应用中从子线程更新主线程UI的有效方法。通过使用Message和Handler机制,开发者可以在不阻塞主线程的情况下更新UI元素。示例代码展示了如何在子线程中获取数据,并通过发送消息到主线程来更新TextView的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为UI只能在主线程里更新,那在子线程中怎么事实更新呢?

一个简便的方法就是用Message的消息传递机制。

需要注意的是,Message导入的包一定要是android.os.Message,而不能是另外两个:


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;  
import android.util.Log;
import android.widget.TextView;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;


public class MainActivity extends Activity {

    String result = "空";

    private TextView textView;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what)
            {
                case 0x123:
                    textView.setText(result);
            }
        }
    };

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

        textView = (TextView)findViewById(R.id.textView);

        new Thread(new Runnable() {
            @Override
            public void run() {
                
                result = "1234";
                Message msg = new Message();
                msg.what=0x123;
                Log.v("test_result",result);
                handler.sendMessage(msg);

                try{
                    Thread.sleep(300);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();

    }

}

<template> <my-form ref="forRef" :model="data"> <my-form-item label="产品名称" prop="name" :rules="[ { required: true, message: '请输入产品名称', trigger: 'blur' }, { max: 10, maxMessage: '产品名称不能超过10个汉字' } ]"> <my-input v-model="data.name"/> </my-form-item> <my-form-item label="产品描述" prop="age"> <my-input v-model="data.age" :rules="[ { required: true, message: '请输入产品描述', trigger: 'blur' }, { max: 10, maxMessage: '姓名不能超过200个汉字' } ]" /> </my-form-item> <my-form-item label="性别" prop="sex" > <my-select v-model="data.sex" :rules="[{ required: true, message: '请选择性别', trigger: 'change' },]"> <my-option v-for="item in sexOptions" :label="item.lable" :value="item.value" /> </my-select> </my-form-item> <my-form-item label="产品单价" prop="price"> <my-input v-model="data.price" :rules="[ { required: true, message: '请输入产品单价', trigger: 'blur' }, { min: 0, message: '产品单价不能小于0', trigger: 'blur' }, { max: 10000, message: '产品单价不能超过10000', trigger: 'blur' } ]" /> </my-form-item> <my-form-item label="产品库存" prop="stock"> <my-input v-model="data.stock" :rules="[ { required: true, message: '请输入产品库存', trigger: 'blur' }, { min: 0, message: '产品库存不能小于0', trigger: 'blur' }, { max: 10000, message: '产品库存不能超过10000', trigger: 'blur' } ]" /> </my-form-item> <my-form-item label="生产厂家" prop="manufacturer"> <my-input v-model="data.manufacturer" :rules="[ { required: true, message: '请输入生产厂家', trigger: 'blur' }, ]" /> </my-form-item> </my-form> {{ data }} <button @click="checkForm">提交</button> <button @click="clearForm">清空</button> </template> <script setup> import myForm from '@/components/myForm'; import myFormItem from '@/components/myForm/myFormItem'; import MyInput from '@/components/input'; import MySelect from '@/components/mySelect'; import MyOption from '@/components/mySelect/myOption'; const forRef = ref() const sexOptions = reactive([{ lable: "男", value: 1 }, { lable: "女", value: 2 }]) const data = reactive({ name: "", age: "", sex: "", price: "", stock: "", manufacturer: "", formCheck: null }) function checkForm() { data.formCheck = forRef.value.validate() } function clearForm() { forRef.value.resetField() } const rules = reactive({ name: [ { required: true, message: '请输入产品名称', trigger: 'blur' }, { max: 10, message: '长度超过10位', trigger: 'blur' }, ], description: [ { required: true, message: '请输入产品描述', trigger: 'blur' }, { max: 200, message: '长度超过200位', trigger: 'blur' }, ], category: [ { required: true, message: '请选择产品分类', trigger: 'change' }, ], }); </script> 为什么rules写在item上不好使了
最新发布
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值