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目前處於開發階段,還有許多尚未完善的地方,不喜勿噴)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章