欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 18:25:24
...

一、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目前处于开发阶段,还有许多尚未完善的地方,不喜勿喷)