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);
    }
}
复制代码

 

posted @   developer_Kale  阅读(674)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
网站流量统计工具
点击右上角即可分享
微信分享提示