Android之Handler使用

什么是Handler

Handler:处理多进程之间的通信,比如,threadB需要调用ThreadA中的代码(如一些耗时的操作,需要在新的界面进行更新),则需要通过Handler进行

handler角色的作用

在这里插入图片描述

Message对象放入到了消息队列MessageQueue

调用了Hanlder的dispatchMessage方法,在该方法中我们完成对Message的处理

1.将消息加入到消息队列中

使用handler. sendMessage将Message对象发送到消息队列中

	msg = Message.obtain(uihandler);

    uihandler.sendMessage(msg);

使用post方法将消息对象发送到MessageQueue中

				Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Runnable thread id " + Thread.currentThread().getId());
                        MainActivity.this.statusTextView.setText("文件下载完成");
                    }
                };
                uiHandler.post(runnable);

2.处理消息队列中的消息

Hanlder的dispatchMessage方法,在该方法中我们完成对Message的处理

	public void dispatchMessage(Message msg) {
	    if (msg.callback != null) {
	        handleCallback(msg);
	    } else {
	        if (mCallback != null) {
	            if (mCallback.handleMessage(msg)) {
	                return;
	            }
	        }
	        handleMessage(msg);
	    }
	}
	private static void handleCallback(Message message) {
	    message.callback.run();
	}

MessageQueue

消息队列用来存放消息的,其中有两个重要的方法,enqueueMessage和next方法

1.enqueueMessage

将消息发送到消息队列中,同时又两种方法

  • sendMessage
  • post(runnable r)

以上两种方法中,通过源码层层调用其实际就是enqueueMessage方法

2.next

从消息队列中取出消息

实例

流程如下

在这里插入图片描述

1.SendMessage方法发送消息

通过此方法发送消息,需要重写handlMessage方法,如下:

   private Handler uihandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            //如果使用的是
            Log.i(TAG,"msg.what= "+msg.what);
            switch (msg.what){
                case 1:
                    System.out.println("handleMessage thread id " + Thread.currentThread().getId());
                    System.out.println("msg.arg1:" + msg.arg1);
                    System.out.println("msg.arg2:" + msg.arg2);
                    MainActivity.this.statusTextView.setText("文件下载完成");
                    Log.i(TAG,"##文件下载完成,更新UI ");
                    break;
            }

            System.out.println("handleMessage thread id " + Thread.currentThread().getId());
            MainActivity.this.statusTextView.setText("文件下载完成");

            Log.i(TAG,"文件下载完成,更新UI ");
        }
    };

1.1 通过使用obtainMessage方法实例化msg

	Message msg = new Message();//msg对象表示线程要处理的事情

    //方式一:使用obtainMessage方法实例化msg,handleMessage中使用msg.what进行匹配
    msg = uihandler.obtainMessage();
    msg.what = 1;
    msg.arg1 = 123456;
    msg.arg2 = 654321;

	uihandler.sendMessage(msg);

1.2 通过obtain方法实例化msg

msg = Message.obtain(uihandler);
uihandler.sendMessage(msg);
Log.i(TAG,"sendMessage ");

2.post方法发送消息

private Handler uiHandler = new Handler();

2.1 实现Runable接口

Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Runnable thread id " + Thread.currentThread().getId());
                        MainActivity.this.statusTextView.setText("文件下载完成");
                    }
                };
                uiHandler.post(runnable);//将Runnable对象通过post方法发送到Handler关联的消息队列中,Handler会在合适的时候将让主线程执行Runnable中的代码,从而更新ui

项目代码

项目代码https://github.com/409144245/HandlerTest

发布了100 篇原创文章 · 获赞 42 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Hh20161314/article/details/101718140