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

来源:互联网 发布:授权查询系统源码 编辑:程序博客网 时间:2024/05/23 20:20

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