項目地址:github.com/AcgnCodeMon…java
上篇文章咱們講解傳統hander使用的一些分析,本篇文章將會針對如何使用RxTask以及其優點進行說明。git
咱們都知道,rxAndroid(rxjava)在線程調度方面作得很是優秀,使用起來也很是方便,那麼爲何咱們還要本身封裝一個handler+thread的庫呢?github
首先,看過rxAndroid源碼的朋友都知道,它的線程調度,本質上也是經過handler實現的,只是進行了高度的封裝。
編程
其次,rxAndroid若是僅僅做爲一個線程調度庫來用的話,顯得很重,若是沒記錯的話rxAndorid庫及相關依賴應該是300k左右,這個大小能夠說是不小了。有人也許會問,爲何僅僅使用線程調度功能,用響應式編程不就好了,一般狀況來講確實是這樣沒錯,可是有些人,好比我,每每只用到了它的線程調度功能,響應式編程雖然你們都在提倡,可是依然還未達到主流的地步,在這種狀況下,貿然使用風格迥異的編程對於一個成熟的項目來講是一個下下策,就比如kotlin,flutter,我暫時不用他們不是由於他們不強大,而是在當下來講,他們仍未達到主流。
而貿然使用非,主流技術進行產品開發,對於公司來講是不負責的,由於你很難保證公司招的下一我的會你這個技術。網絡
最後,一般來說,一個優秀的庫,應該是小而精,而不是大而全,就像rxAndroid同樣,若是他的線程調度部分能夠單獨依賴,那麼可能也就沒有什麼RxTask了。固然了,這裏也不是說rxAndroid不優秀,只是若是它可以拆分的更細緻一點話,相信對於廣大開發者來講,可以更好的進行技術組合。架構
而RxTask的特色,歸納一下就是:框架
固然了,我以爲最大優勢仍是易於修改,畢竟不到一千行代碼,隨便看下就能夠根據自身需求進行更改,rxAndroid這種大型庫來說,想clone下來本身維護,本身改,太不現實了。ide
推薦哪些人嘗試一下本庫:性能
**compile 'com.xujl:task:0.0.1-alpha'**
複製代碼
RxExecutor.getInstance()
.executeUiTask(new Task() {
@Override
public void onlyRunUiTask () {
super.onlyRunUiTask();
//ui相關操做
}
});
複製代碼
只須要調用RxExecutor的executeUiTask方法,而且覆寫Task的onlyRunUiTask方法便可實現快速切回主線程進行ui操做,舒適提示,本方法只是在內部建立維護了一個handler,沒有建立線程,因此沒有線程損耗。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相關操做
}
});
複製代碼
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的同窗應該對這種寫法很熟了,很少作解釋。
此使用方法涉及綁定界面,請參考github上的demo進行使用
複製代碼
注意:若是任務未結束時,生命週期結束,能夠選擇完成子線程的任務或者不完成(一般狀況下,咱們都會要求依然完成子線程任務,以防止數據操做執行到一半退出後出現數據錯誤),可是不論你選擇哪一種,框架均不會再回調onNext和onFinished方法,由於此時handler已經解除了和界面的依賴
另外,須要特別指出一點,若是你但願虛擬機可以在生命週期結束後儘快回收,或者你的子線程任務是個耗時很長的任務,那麼你須要單首創建一個本身的TaskCallable類繼承TaskCallable,這點相信看過第一篇文章的同窗都知道爲何了,由於activity內部使用匿名內部類方式建立一個task時,依然會形成隱式持有activity,這是任務若是未結束,activity依然是沒法回收的。具體實現,參考demo。
以上能夠說是你們平時用到的最多的狀況了,框架中還封裝了平時常見的倒計時任務(如驗證碼倒計時),和定時循環任務(如網絡請求輪詢)。若是你們還須要實現其餘功能,能夠本身動手修改添加,也能夠加入溝通羣,直接向做者提出。
技術交流羣:275885217---Android架構研發協會