zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    控制内插表达式的格式
    MySQL查看实时执行的SQL语句
    测试开源.net 混淆器ConfuserEx
    nginx 目录自动加斜线”/”
    兼职程序员一般可以从什么平台接私活?
    .NET之Hangfire快速入门和使用
    c#通过操作mongodb gridfs实现文件的数据库存储
    c# .net core + .net framework mongodb nuget 包
    asp.net core ModelState 模型状态验证扩展类
    Linux查看系统基本信息,版本信息(最全版)
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3880746.html
Copyright © 2011-2022 走看看