Handler

来源:互联网 发布:js对象参数 编辑:程序博客网 时间:2024/06/05 21:58

】Handler简单机制
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,使用ThreadLocal目的是保证每一个线程只创建一个Looper,之后其它的Handler直接获取第一个Handler创建的Looper.Looper初始化的时候会创建一个消磁队列MessageQueue

Handler持有对UI主线程消息队列MesageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中

UI主线程通过Looper循环查询消息队列,当发现有消息存在时,将消息取出,分析消息对应的Handler,然后将消息发给指定的Handler进行处理

】 子线程向主线程发送消息

package com.example.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

private Handler handler2=new Handler();Handler handler = new Handler() {    public void handleMessage(Message msg) {        // 处理消息        switch (msg.what) {        case 1:// 发送的消息类型是1 通过what获得            // int a1=msg.arg1;            // int a2=msg.arg2;            // String s=msg.obj.toString();            // Toast.makeText(MainActivity.this,s+"fd",0).show();            // /////////////////////////////////////////////////////////////////            // 处理用bundle发送的消息            Bundle bundle = msg.getData();            String s = bundle.getString("name");            break;        default:            break;        }    };};@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);}/** * 子线程向主线程发送数据 */public void bt1(View v) {    new Thread(new Runnable() {        @Override        public void run() {            // 用Message对象封装消息            // Message message=new Message();            /**             * 通过从消息池中获取Message对象,就不用一直new,节省内存             */            // Message message=Message.obtain();            // message.what=1;//用来识别消息            // message.arg1=2;            // message.arg2=3;            // message.obj="hello";            //            // //发送消息            // handler.sendMessage(message);            // /////////////////////            // //////////////////////////////////////////////////////////////////            // 利用bundle封装数据            Message message = new Message();            message.what = 1;            Bundle bundle = new Bundle();            bundle.putString("name", "d");            message.setData(bundle);            handler.sendMessage(message);        }    }).start();}/** * 通过post方式发送消息 */public void bt2(View v) {    /**     * 底层也是通过handleMessage方法处理的消息     */  handler2.post(new Runnable() {    @Override    public void run() {    }});  //可以将消息从消息队列中移除

// handler2.removeCallbacks();
}

}

主线程向子线程发送消息
package com.example.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 {
private Handler handler;

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    /**     * 开启子线程     */    new Thread(new Runnable() {        /**         * 消息队列伴随着looper的创建而创建,主线程会主动创建looper         * 但是在子线程中,需要自己创建         * Looper.prepare();         * Looper.loop()//循环遍历消息对垒         */        @Override        public void run() {            Looper.prepare();            handler=new Handler(){                @Override                public void handleMessage(Message msg) {                    super.handleMessage(msg);                    switch (msg.what) {                    case 1:                        Toast.makeText(MainActivity.this, msg.obj.toString(), 0).show();                        break;                    default:                        break;                    }                }            };            Looper.loop();        }    }).start();}/** * 主线程向子线程发送数据 * @param v */public void bt1(View v){    Message message=handler.obtainMessage();    message.what=1;    message.obj="hello";    handler.sendMessage(message);}

}

0 0