Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 初涉RxAndroid .from() .just() 以及線程操作

初涉RxAndroid .from() .just() 以及線程操作

編輯:關於Android編程

上一篇,整了個利用RxJava下載圖片刷UI的一個小案例,從者一篇開始將要一部分一部分的“拆”RxJava(會寫一系列,每一篇內容精良精簡)

那從何學起?官網Wiki:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava

先從簡單的from() 和just()方法開始,先看下例子實現的內容(2部分,一個類似於短信驗證碼等待的操作,一個就是遍歷數組打Log)

效果:
這裡寫圖片描述

Log部汾喎?/kf/yidong/wp/" target="_blank" class="keylink">WPGJyIC8+DQo8aW1nIGFsdD0="這裡寫圖片描述" src="/uploadfile/Collfiles/20160330/20160330092944293.png" title="\" />

RxJava自帶了2個快捷創建事件隊列的方法 from() just()<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPsew1d+/ybSryOvSu7j2yv3X6aOsuvPV37/J0tS0q8jrtuC49rLOyv3Iu7rzxdzSu7j2Y2FsbKOoo6m1xLvYtfehozwvcD4NCjxwPrT6wuvI58/Co7o8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> Observable.just(1, 3, 4, 5, 6).subscribe(new Action1() { @Override public void call(Integer integer) { LogUtils.d("自動計算到 " + integer); } }); String aa[]={"1","2","3","4","5"}; Observable btn2Observable= Observable.from(aa); btn2Observable.subscribe(new Action1() { @Override public void call(Object o) { LogUtils.d("自動計算到 " + o); } });

像這邊的行為類似於我們的 for循環然後每一個循環裡println一個數,那麼問題來了,這代碼量看上去還比for長一點,有什麼優勢?

賣個關子我們看第二個例子

效果圖中我們的按鈕的字在不斷的被刷新,類似的效果可以用Handler或者是RunOnUiThread(好像大小寫有拼錯,懶得查了理解就好)實現,那又為什麼用RxJava呢? 看代碼說話

在類裡面聲明了我們的觀察者和被觀察者,被觀察者進行著我們的業務邏輯,觀察者做監聽。

      Observable.just(1, 3, 4, 5, 6).subscribeOn(Schedulers.newThread()).subscribe(new Action1() {
                    @Override
                    public void call(Integer integer) {
                        LogUtils.d("自動計算到 " + integer);
                    }
                });

                String aa[] = {"1", "2", "3", "4", "5"};
                Observable btn2Observable = Observable.from(aa);
                btn2Observable.subscribeOn(Schedulers.newThread()).subscribe(new Action1() {
                    @Override
                    public void call(Object o) {
                        LogUtils.d("自動計算到 " + o);
                    }
                });

這裡看完觀眾們又要問了,這代碼量也沒少啊,RxJava優勢在哪?

那我們再貼一段

 btn1Observable.subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(btn1Oserver);

在我們的btn1的click行為裡我們做了這麼個操作,子線程執行邏輯內容,主線程刷UI。

現在我來回答剛才的疑問

優勢在哪:
1.所有的行為都有相應的回調,而不用我們人工去申明額外的回調函數
2.異步,異步,異步!!!重要的事情說三遍

無論你的程序邏輯變得多麼的復雜,代碼構造依然整潔明了。

那既然提到了異步的內容,這邊來說一下負責線程操作的類Scheduler

默認情況下哪走了subscribe()哪個線程就要干這件事

來例舉下可用的一些工作狀態

.immediate() :默認狀態,哪用算哪

.newThread(): 開新線程做這件事

.io(): 跟newThread()差不多,不過在線程池大小上有差異,他是無限大

.computation():跟創建固定的線程池操作

.mainThread():在主線程做事

那既然說到了線程內容,再補充下如何設置線程

subscribeOn(): subscribe() 所發生的線程,也就是干活的線程

observeOn(): Subscriber 所運行在的線程,也就是的回調發生的線程

在例子中我有打出具體的線程ID,我們來看一下

主線程的

03-28 16:08:30.878 8717-8717/sample.wjj.rxandroidglidedemo D/LogUtils-MainActivity.onCreate(MainActivity.java:129): --->Main Thread  id 1

工作線程的

03-28 16:46:20.358 8717-6259/sample.wjj.rxandroidglidedemo D/LogUtils-MainActivity$3.call(MainActivity.java:91): 子線程id 3489

也就應正了這一點,我們可以決定我們要做的操作在哪執行,反復強調,異步!!!!讓主線程盡量少干活(或者說,讓他干他應該干的活)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved