Android XHandler —极大方便UI线程和工作线程的切换

一、XHandler 功能介绍

XHandler是对Android Handler进行的扩展,不仅支持在UI主线程中进行消息的发送处理,还支持了在工作线程中进行消息的发送处理,工作线程采用线程池实现。并且可以很方便的在UI主线程和工作线程之前进行切换。解放UI主线程的微耗时操作,减少Android ANR,让APP更加流畅。

二、XHandler 使用讲解

(1)XHandler初始化

  • 目前提供2中构造方法:
    • 一种默认无参构造器;
    • 另一种是传入Context参数,XHandler内部采用弱引用的方式(推荐使用)。
//第一种:默认无参构造器
private XHandler mXHandler = new XHandler();

//第二种传入context,XHandler内部采用弱引用的方式,推荐使用该构造方法
private XHandler mXHandler = new XHandler(this) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //该方法为处理UI主线程的消息
        }
        @Override
        public void handleMessageOnWorker(Message msg) {
            super.handleMessageOnWorker(msg);
            //该方法为处理工作线程的消息
        }
    };

(2)XHandler发送消息到工作线程

  • (1)XHandler中提供向工作线程发送消息的一组方法,方法名以**OnWorker结尾。
    • 例如: mXHandler.postOnWorker(runnable)
    • mXHandler.sendMessageOnWorker(msg)
    • mXHandler.sendEmptyMessageOnWorker(0) 等。
  • (a)XHandler从工作线程 ——> UI主线程
//在工作线程中执行
mXHandler.postOnWorker(new Runnable() {
            @Override
            public void run() {

                //工作线程中执行,不影响UI线程
                //如果工作线程中的耗时任务完成,此时想切换到UI主线程,怎么办???
                //依然通过mXHandler来发送消息到UI主线程。使用Hander的原始消息发送方法。
                mXHandler.sendEmptyMessage(MSG_02);

            }
        });
  • (b)XHandler 从UI主线程 ——> 工作线程
//在UI线程中执行
mXHandler.post(new Runnable() {
                @Override
                public void run() {

                    //从主线程切换到工作线程中
                    mXHandler.sendEmptyMessageOnWorker(MSG_02);

                }
            });

(3)、XHandler消息处理

  • (a)UI主线程消息处理方法——handleMessage(msg)

  • (b)工作线程消息处理方法——handleMessageOnWorker(msg)

  • 示例代码如下:
   private XHandler mXHandler = new XHandler(this) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_01:
                    Toast.makeText(MainActivity.this, "UI线程发送消息-toast", Toast.LENGTH_LONG).show();
                    break;
                case MSG_02:
                    Toast.makeText(MainActivity.this, "工作线程切换到主线程的-toast", Toast.LENGTH_LONG).show();
                    break;
            }
        }

        @Override
        public void handleMessageOnWorker(Message msg) {
            super.handleMessageOnWorker(msg);
            switch (msg.what) {
                case MSG_01:
                    Log.e(TAG, "handleMessageOnWorker: 工作线程发送消息");
                    break;
                case MSG_02:
                    Log.e(TAG, "handleMessageOnWorker: UI线程post切换到工作线程");
                    break;
            }
        }
    };

三、XHandler 实现原理

通过Android API提供的HandlerThread类,该类也是一个Thread线程类,不同的是其中加入了Looper的实现,因此可以配合Handler进行使用。然后再handleMessage方法中,把消息传递过来的Runnable线程接口,交由线程池ExecutorService去执行。如果不用线程池ExecutorService,则消息由HandlerThread执行,如果频繁发送消息,则消息会依次顺序执行。


Github项目地址(欢迎Star) : XHandler

(XHandler目前处于开发阶段,还有许多尚未完善的地方,不喜勿喷)

猜你喜欢

转载自blog.csdn.net/dhl91604/article/details/74420602