WorkerThread与MainThread之间通过Handler进行最简单的消息传递
一、从自己开启的线程中给主线程发送信息,更新UI
这个实例的效果是,在线程中通过handler发送一条信息给handler,然后通过handler更改UI线程中,textview的文字。
主要方法是(在线程中生成消息对象,并发送消息。这里可以设置what,我图简单就没设置):
class MyThread extends Thread{ @Override public void run() { try { Thread.sleep(2*1000); } catch (InterruptedException e) { e.printStackTrace(); } Message msg = mHandler.obtainMessage();//从handler得到消息对象 msg.obj = "message";//通过这个对象来存放信息 mHandler.sendMessage(msg);//给handler发送消息 } }
完整代码如下:
MainActivity.java
package com.kale.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.TextView; public class MainActivity extends Activity { TextView valeTv; private Thread thread; private Handler mHandler; class MyHandler extends Handler{ @Override public void handleMessage(Message msg) { System.out.println("线程名:"+Thread.currentThread().getName()); valeTv.setText((String) msg.obj); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); valeTv = (TextView) findViewById(R.id.vale_textView); mHandler = new MyHandler(); thread = new MyThread(); // 启动线程 thread.start(); } class MyThread extends Thread{ @Override public void run() { try { Thread.sleep(2*1000); } catch (InterruptedException e) { e.printStackTrace(); } Message msg = mHandler.obtainMessage();//从handler得到消息对象 msg.obj = "message";//通过这个对象来存放信息 mHandler.sendMessage(msg);//给handler发送消息 } } }
二、从主线程给自己定义的线程中发送信息
主要步骤就是在在新新线程中的run()中初始化looper,然后建立handler。接着,在主线程中建立一个消息对象,这个消息对象时由新线程中的handler建立的。这样二者就联系起来了
主要代码如下:
// 定义一个自己的线程 class MyThread extends Thread { @Override public void run() { System.out.println("线程开始运行"); Looper.prepare();// 在线程中必须建立一个自己的looper,不能用ui线程中的 handler = new Handler() {// 在新线程中创建Handler时必须创建Looper public void handleMessage(Message msg) { Toast.makeText(MainActivity.this, (String) msg.obj, 0).show(); }; }; // looper不断的从消息队列中取出消息,如果没有就阻塞 Looper.loop(); }
全部代码:
package com.kale.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { Handler handler; // 定义一个自己的线程 class MyThread extends Thread { @Override public void run() { System.out.println("线程开始运行"); Looper.prepare();// 在线程中必须建立一个自己的looper,不能用ui线程中的 handler = new Handler() {// 在新线程中创建Handler时必须创建Looper public void handleMessage(Message msg) { Toast.makeText(MainActivity.this, (String) msg.obj, 0).show(); }; }; // looper不断的从消息队列中取出消息,如果没有就阻塞 Looper.loop(); } } private MyThread thread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); thread = new MyThread(); // 启动线程 thread.start(); } public void buttonListener(View v) { sentMsg(); } private void sentMsg() { // 创建消息 Message msg = handler.obtainMessage(); msg.obj = "success!"; handler.sendMessage(msg); } }
分类:
Handler
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?