Android Framework 02--- 手写Handle

2022-03-25  本文已影响0人  沪漂意哥哥

一. Handler

public class Handler {
    Looper mLooper;
    public Handler() {
        mLooper = Looper.myLooper();
    }
    public void sendMessage(Message msg) {
        enqueueMessage(msg);
    }
    private void enqueueMessage(Message msg) {
        msg.target = this;
        mLooper.messageQueue.enqueueMessage(msg);
    }

    public void handleMessage(Message msg) {


    }
}

二. Message

public class Message {
    String obj;
    Handler target;
    public Message() {
    }
    public Message(String obj) {
        this.obj = obj;
    }
    public String toString(){
        return obj.toString();
    }
}

三. MessageQueue

public class MessageQueue {

    BlockingQueue<Message> queue = new ArrayBlockingQueue<>(100);

    public void enqueueMessage(Message msg) {
        try {
            queue.put(msg);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public Message next() {
        Message msg = null;
        try {
            msg = queue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return msg;
    }
}

四. Looper

public class Looper {
    static ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();
    MessageQueue messageQueue;
    private Looper() {
        messageQueue = new MessageQueue();
    }
    public static Looper myLooper() {
        return sThreadLocal.get();
    }
    public static void  prepare() {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper());
    }
    public static  void looper() {
        final Looper me = myLooper();
        final MessageQueue queue = me.messageQueue;
        for (; ; ) {
            Message msg=   queue.next();
            msg.target.handleMessage(msg);
        }
    }
}

五. 测试

private static Handler handler111;
    public static void main(String[] args) {
        Looper.prepare();
        handler111 = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                System.out.println("handler111 " + msg + " thread  " + Thread.currentThread().getName());
            }
        };

        new Thread() {
            @Override
            public void run() {
                handler111.sendMessage(new Message("david---->jett"));
            }
        }.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Looper.looper();

    }

六. 代码地址

 https://gitee.com/luisliuyi/android-handler.git
上一篇下一篇

猜你喜欢

热点阅读