Handler,Looper和HandlerThread

一.Handler封装了消息的发送(主要包括消息发送给谁)

Looper

1.内部包含一个消息队列即MessageQueue,所有的Handler发送的消息都走向这个消息队列。

2.Lopper.Looper方法,就是一个死循环,不断地从MessageQueue取消息,若有消息就处理消息,没有消息就阻塞。

二.MessageQueue,就是一个消息队列,可以添加消息,并处理消息。

三:Handler也很简单,内部也会跟Looper进行关联,也就是说在Handler的内部可以找到Looper,找到了Looper也就

找到了MessageQueue,在Handler中发送消息,其实就是向MessageQueue队列中发送消息。


总结:handler负责发送消息,Looper负责接收Handler发送的消息,并直接把消息回传给handler自己。MessageQueue是一个储存消息的容器。


二:handler与Looper的基本使用示例

package com.example.kirito.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

/**
 * Created by kirito on 2016.10.13.
 */

public class FirstThread extends Activity {


    private class MyThread extends Thread{
        private Handler handler;
        @Override
        public void run() {
            super.run();
            //loop preapare方法开启looper
            Looper.prepare();
            //下面创建的handler自动与与Looper关联
            handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    //打印当前线程名称
                    System.out.print("current thread is " + Thread.currentThread());
                }
            };
            //loop方法循环消息
            Looper.loop();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testhandler);
        MyThread thread = new MyThread();
        thread.start();
        try {
            thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //触发handleMessage方法
        thread.handler.sendEmptyMessage(1);
    }
}


三:在HandlerThread里进行异步操作

package com.example.kirito.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;

/**
 * Created by kirito on 2016.10.13.
 */

public class Second extends Activity {
    //HandlerThread可以创建子线程,进行异步操作
    private HandlerThread ht;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ht = new HandlerThread("handlerthread");
        ht.start();
        Handler handler = new Handler(ht.getLooper()){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //进行异步操作
                System.out.print("current thread ---->" + Thread.currentThread());
            }
        };
        handler.sendEmptyMessage(1);
    }
}


四:handler之间的信息交互

两个handler分别在其各自的handleMessage方法里调用对方handler的sendMessage方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值