Handler+Thread的一種封裝嘗試RxTask(下篇)

項目地址:github.com/AcgnCodeMon…java

  上篇文章咱們講解傳統hander使用的一些分析,本篇文章將會針對如何使用RxTask以及其優點進行說明。git

  咱們都知道,rxAndroid(rxjava)在線程調度方面作得很是優秀,使用起來也很是方便,那麼爲何咱們還要本身封裝一個handler+thread的庫呢?github

  首先,看過rxAndroid源碼的朋友都知道,它的線程調度,本質上也是經過handler實現的,只是進行了高度的封裝。
編程

  其次,rxAndroid若是僅僅做爲一個線程調度庫來用的話,顯得很重,若是沒記錯的話rxAndorid庫及相關依賴應該是300k左右,這個大小能夠說是不小了。有人也許會問,爲何僅僅使用線程調度功能,用響應式編程不就好了,一般狀況來講確實是這樣沒錯,可是有些人,好比我,每每只用到了它的線程調度功能,響應式編程雖然你們都在提倡,可是依然還未達到主流的地步,在這種狀況下,貿然使用風格迥異的編程對於一個成熟的項目來講是一個下下策,就比如kotlin,flutter,我暫時不用他們不是由於他們不強大,而是在當下來講,他們仍未達到主流。
  而貿然使用非,主流技術進行產品開發,對於公司來講是不負責的,由於你很難保證公司招的下一我的會你這個技術。網絡

  最後,一般來說,一個優秀的庫,應該是小而精,而不是大而全,就像rxAndroid同樣,若是他的線程調度部分能夠單獨依賴,那麼可能也就沒有什麼RxTask了。固然了,這裏也不是說rxAndroid不優秀,只是若是它可以拆分的更細緻一點話,相信對於廣大開發者來講,可以更好的進行技術組合。架構

  而RxTask的特色,歸納一下就是:框架

  • 基於原生handler(易於修改)
  • 輕量級(不到一千行代碼)
  • 功能專注(僅僅只含有線程調度和線程管理功能)
  • 支持綁定fragment或activity的生命週期,有效防止內存泄漏
  • 綁定生命週期後,在生命週期結束時支持完成子線程中的任務或者中斷任務,能夠根據自身需求改變
  • 方便快速的建立一個子線程任務,減小頻繁建立回收線程的性能損耗

  固然了,我以爲最大優勢仍是易於修改,畢竟不到一千行代碼,隨便看下就能夠根據自身需求進行更改,rxAndroid這種大型庫來說,想clone下來本身維護,本身改,太不現實了。ide

  推薦哪些人嘗試一下本庫:性能

  • 如今爲止還在隨意建立handler和thread的
  • 使用了rxAndroid進行線程調度,可是僅僅只用到了rxAndroid的線程調度

如何使用本庫?

**compile 'com.xujl:task:0.0.1-alpha'**
複製代碼

常規用法:

1.線程調度,當前爲子線程,須要快速切回主線程中操做控件
RxExecutor.getInstance()
        .executeUiTask(new Task() {
             @Override
            public void onlyRunUiTask () {
                super.onlyRunUiTask();
                //ui相關操做
                }
           });
複製代碼

  只須要調用RxExecutor的executeUiTask方法,而且覆寫Task的onlyRunUiTask方法便可實現快速切回主線程進行ui操做,舒適提示,本方法只是在內部建立維護了一個handler,沒有建立線程,因此沒有線程損耗。ui

2.在子線程中作耗時操做,而且在子線程執行完畢後,在主線程進行ui操做
RxExecutor.getInstance()
        .executeTask(new Task() {
           @Override
           public void run (Emitter emitter) throws Exception {
               super.run(emitter);
               //模擬耗時操做
               Thread.sleep(1000);
                }

           @Override
           public void onFinished () {
                super.onFinished();
                //ui相關操做
                }
            });
複製代碼
3.在子線程中作耗時操做,而且在子線程執行完畢後,發送某些數據到主線程並進行ui操做
RxExecutor.getInstance()
        .executeTask(new Task() {
           @Override
           public void run (Emitter emitter) throws Exception {
               super.run(emitter);
               //模擬耗時操做
               Thread.sleep(1000);
               emitter.next("任務完成");
                }

           @Override
           public void onNext (Object object) {
                super.onNext(object);
                String result = (String) object;
                //拿到結果result,並進行相關ui操做
           }
複製代碼

  用過rxAndroid的同窗應該對這種寫法很熟了,很少作解釋。

4.在子線程中作耗時操做,而且這個耗時任務綁定生命週期,而且在子線程執行完畢後,在主線程進行ui操做
此使用方法涉及綁定界面,請參考github上的demo進行使用
複製代碼

  注意:若是任務未結束時,生命週期結束,能夠選擇完成子線程的任務或者不完成(一般狀況下,咱們都會要求依然完成子線程任務,以防止數據操做執行到一半退出後出現數據錯誤),可是不論你選擇哪一種,框架均不會再回調onNext和onFinished方法,由於此時handler已經解除了和界面的依賴

  另外,須要特別指出一點,若是你但願虛擬機可以在生命週期結束後儘快回收,或者你的子線程任務是個耗時很長的任務,那麼你須要單首創建一個本身的TaskCallable類繼承TaskCallable,這點相信看過第一篇文章的同窗都知道爲何了,由於activity內部使用匿名內部類方式建立一個task時,依然會形成隱式持有activity,這是任務若是未結束,activity依然是沒法回收的。具體實現,參考demo。

  以上能夠說是你們平時用到的最多的狀況了,框架中還封裝了平時常見的倒計時任務(如驗證碼倒計時),和定時循環任務(如網絡請求輪詢)。若是你們還須要實現其餘功能,能夠本身動手修改添加,也能夠加入溝通羣,直接向做者提出。

技術交流羣:275885217---Android架構研發協會

相關文章
相關標籤/搜索