首页 > 代码库 > WorkerThread与MainThread之间通过Handler进行最简单的消息传递

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);    }}