Handle、Looper与Message之间的关系

  1. handle 创建message对象,然后把message发送给Looper的 messagequeue中
  2. Looper轮训messagequeue,从队列中取出message,把message发送给指定的handle处理

注意点

1、线程与handle、Looper、messagequeue的对应关系;
线程:handle =1:多
线程:Looper =1:1
线程:messagequeue=1:1
2. 在UI 线程中不需要主动设置looper ,UI线程默认已经实现。如果是在子线程中,需要单独设置
3、Looper是如何区分把message发送给哪个handle
是message中有handle的引用,looper通过message取得handler

 package com.zhang.demo1.utils;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class LooperThread extends Thread {
    protected static final String TAG = "LooperThread";
    private  Handler handler ;
    private  Handler handler1 ;
    @Override
    public void run() {
        Looper.prepare();
        handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                int msgType=msg.what;
                switch (msgType) {
                case 2:
                    MyLog.i(TAG, "msgType:"+msgType);
                    break;

                default:
                    break;
                }
            }
        };
        handler1=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                int msgType=msg.what;
                switch (msgType) {
                case 3:
                    MyLog.i(TAG, "msgType:"+msgType);
                    break;

                default:
                    break;
                }
            }
        };
        Looper.loop();
    }
    public Handler getHandler() {
        return handler;
    }
    public Handler getHandler1() {
        return handler1;
    }

}
package com.zhang.demo1;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;

import com.zhang.demo1.utils.LooperThread;
import com.zhang.demo1.utils.PromptUtils;
import com.zhang.demo1.view.RippleView;

public class HandleActivity extends GaoqingBaseActivity {
    private static Activity instance;
    private static Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            int msgtype = msg.what;
            switch (msgtype) {
            case 1:
                PromptUtils.showCustomToast(instance, "rv dian ji " + msgtype, Gravity.BOTTOM);
                break;

            default:
                break;
            }
        };
    };
    private static LooperThread looperThread;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handle);
        //handler --messageQueue -- looper 
        //handler 把msg或runnable发送到looper中的messageQueue队列的队尾,
        //looper 循环遍历messageQueue ,从队头中获取msg ,发送给handler处理
        //注意点:1、handler创建的线程中,如果是UI线程,则默认已经实现了looper 。如果是子线程,则需要自己创建looper ,不然则会抛出异常
        //2、thread : handler 关系是1:多
        instance = this;
        looperThread=new LooperThread();
        looperThread.start();
        RippleView rv_bt = (RippleView) findViewById(R.id.rv_bt1);
        rv_bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                handler.sendEmptyMessage(1);
            }
        });
        RippleView rv_bt2 = (RippleView) findViewById(R.id.rv_bt2);
        rv_bt2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    looperThread.getHandler().sendEmptyMessage(2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        RippleView rv_bt3 = (RippleView) findViewById(R.id.rv_bt3);
        rv_bt3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    looperThread.getHandler1().sendEmptyMessage(3);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值