在workThread中得到数据,去更新UI线程(初学备忘)

这篇博客记录了Android中如何在工作线程获取数据后通过Handler更新UI线程。点击Button启动MyThread工作线程,线程休眠后模拟获取数据,然后将数据包装成Message发送到消息队列。Looper在UI线程中取出消息并调用handMessage()方法,从而在主线程安全地更新TextView内容。

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

备忘

1:这段代码中除了main线程,就是MyThread线程,除了在MyThread实现的东西外,其他的都算是在main线程中

2:代码流程

点击Button-->调用workThread:workThread实现的是把获得的数据发送出来->msg被发送到消息队列中去了,由looper取出后在UI线程的handMessage()方法中处理。例如更新UI.---handMessage()方法在主线程中,所以可以更新UI.

3:

注,我把

String s = "从网络中获取的值";//从SDcard读取数据等
Message msg = mHandler.obtainMessage();
msg.obj = s;
mHandler.sendMessage(msg);

写到run方法体外了,然后就提示
Multiple markers at this line
- Syntax error on token , misplaced construct
- Syntax error on token "msg", VariableDeclaratorId expected after
this token


 

package com.example.undertest;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

@SuppressLint("HandlerLeak")
public class UnderTest extends Activity {
 Button button = null;
 TextView textView = null;
 myHandler mHandler = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_under_test);
  button = (Button) findViewById(R.id.button);
  textView = (TextView) findViewById(R.id.testview);
  mHandler = new myHandler();
  // 在button的监听器中启动workThread,点击button,启动mThread线程
  button.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    MyThread mThread = new MyThread();
    mThread.start();
   }
  });

 }

 class myHandler extends Handler {

  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   String s=(String)msg.obj;
   textView.setText(s);//更新UI

  }

 }

 // 对控件的操纵只能放在UI线程中,不能放到workThread中,workTread一般是处理后台的事情。例如网络数据的请求,获取
 class MyThread extends Thread {

  @Override
  public void run() {
   // 线程启动后,让线程休眠2秒钟
   try {
    Thread.sleep(2 * 1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   String s = "从网络中获取的值";//从SDcard读取数据等
   Message msg = mHandler.obtainMessage();
   msg.obj = s;
   mHandler.sendMessage(msg);// msg被发送到消息队列中去了,由looper取出后在UI线程的handMessage()方法中使用
  }

 }
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值