public class LoginActivity extends BaseActivity implements LoginView { Handler handler = new Handler(); @Override protected int getLayoutId() { return R.layout.activity_main; } @Override protected void initDatas() { /** * 一、初始的RxJava */// rxJavaDemo(); /** * 二、簡潔版的RxJava */// rxJavaDemo_concise(); /** * 三、用操做符來進行操做Rxjava */// rxJavaDemo_operator(); /** * 四、深的操做符號(*****) */// rxJavaDemo_operator_more(); /** * 五、更深的操做符號(主要是講 onComplete()和onError() ) * 這兩個函數用來通知訂閱者,被觀察的對象將中止發送數據以及爲何中止(成功的完成或者出錯了)。 * * 還有RxJava 線程調度的問題 */// rxJavaDemo_operator_more_more(); /*** * Rxjava 在Android 中應用 */ rxJavaDemo_operator_more_more_android(); } /** * 接着要介紹的就是AndroidObservable,它提供了跟多的功能來配合Android的生命週期。 * bindActivity()和bindFragment()方法默認使用AndroidSchedulers.mainThread()來執行觀察者代碼,這兩個方法會在Activity或者Fragment結束的時候通知被觀察者中止發出新的消息。 */ private void rxJavaDemo_operator_more_more_android() { } private void rxJavaDemo_operator_more_more() { Subscription a = Observable.just("這個在的線程是:").subscribeOn(Schedulers.io())//訂閱者發生在 工做線程中 即io .observeOn(AndroidSchedulers.mainThread())//發生在主線程中 即 觀察者 在 main線程中 .subscribe(s -> showMessagers(s)); //中止當前的操做 RxJava的另一個好處就是它處理unsubscribing的時候,會中止整個調用鏈。 // 若是你使用了一串很複雜的操做符,調用unsubscribe將會在他當前執行的地方終止。不須要作任何額外的工做!// a.unsubscribe(); new View(this).postDelayed(() -> a.unsubscribe(), 2000); } /** * 相比更加詳細的操做符學習 */ private void rxJavaDemo_operator_more() {// Observable.from()方法,它接收一個集合做爲輸入,而後每次輸出一個元素給subscriber:// ArrayList<String> list = new ArrayList<>();//// list.add("d");// list.add("ddddd");// String[] arrays = {"d", "b"};// Observable.from(list).subscribe(s -> showMessagers(s)); //將list數據給觀察者 這個爲比較複雜的寫法了 getDbDatas().subscribe(listData -> { Observable.from(listData).subscribe(listSring -> showMessagers(listSring)); }); /** * 這個是用flatmap寫的 相對來講要簡單不少 */ getDbDatas().flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> strings) { return Observable.from(strings); } }).subscribe(s -> showMessagers(s)); /** * 用蘭博啦來寫就更簡單了 */ getDbDatas().flatMap(listData -> Observable.from(listData)).subscribe(listString -> showMessagers(listString)); /** * 接着前面的例子,如今我不想打印URL了,而是要打印收到的每一個網站的標題。 * 問題來了,個人方法每次只能傳入一個URL,而且返回值不是一個String, * 而是一個輸出String的Observabl對象。使用flatMap()能夠簡單的解決這個問題。 */ getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).subscribe(title -> showMessagers(title)); /** * filter()輸出和輸入相同的元素,而且會過濾掉那些不知足檢查條件的。 * take()若是咱們只想要最多5個結果: * doOnNext()容許咱們在每次輸出一個元素以前作一些額外的事情,好比這裏的保存標題。 */ getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).filter(title -> title != null).take(5).doOnNext(title -> saveTitle(title)).subscribe(title -> showMessagers(title)); } /** * 保存標題等操做 */ public void saveTitle(String t) { } /** * 根據 string 串來進行查詢Title */ Observable<String> getTitle(String URL) { String data = "data"; return Observable.just(data); } /** * 返回Observable<String>數據 * * @return */ public Observable<String> getStringData() { return Observable.just("數據"); } /** * 獲得Observable<List<String>>對象 * * @return */ public Observable<List<String>> getDbDatas() { List listData = new ArrayList(); listData.add("a"); listData.add("b"); listData.add("c"); listData.add("d"); return Observable.just(listData); } /** * 用RxJava中操做符來進行操做 map就是來進行對observable改變的 map()操做符就是用於變換Observable對象的 */ private void rxJavaDemo_operator() { Observable.just("這個是操做符的操做哦").map(s -> s + "demo").subscribe(s -> showMessagers(s)); Observable.just("操做符號哦222222").map(s -> s.hashCode()).subscribe(s -> showMessagers(s.toString()));//中間對 observable 進行改變 變成hash 值 Observable.just("操做符號哦3333複雜的").map(s -> s.hashCode()).map(i -> Integer.toString(i)).subscribe(s -> showMessagers(s));//連續兩個map進行轉接 } /** * 簡潔版本的 RxJava */ private void rxJavaDemo_concise() { /** * 好比Observable.just就是用來建立只發出一個事件就結束的Observable對象,上面建立Observable對象的代碼能夠簡化爲一行 */ Observable<String> myObservable = Observable.just("這個是隻發出一個事件的-->這個是RxJava"); /** * 接下來看看如何簡化Subscriber,上面的例子中,咱們其實並不關心OnComplete和OnError,咱們只須要在onNext的時候作一些處理,這時候就可使用Action1類。 */ Action1<String> onNextAction = new Action1<String>() { @Override public void call(String s) { //至關於Subscriber中的接受 Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show(); } }; myObservable.subscribe(onNextAction); //其實上面的徹底能夠寫成這樣的哦 Observable.just("結合到一塊兒的寫法").subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show(); } }); //或者用lambda表達式的寫法 這個就更簡單了哦~~~~ Observable.just("lambda表達式的寫法 看看星星").subscribe(s -> Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show()); } /** * Observable 被觀察者 Subscribers 觀察者 */ private void rxJavaDemo() { /** * 建立觀察者模式 --> 被觀察者 * * 一個Observable能夠發出零個或者多個事件,知道結束或者出錯。 * 每發出一個事件,就會調用它的Subscriber的onNext方法,最後調用Subscriber.onNext()或者Subscriber.onError()結束。 */ Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("這是RxJava"); subscriber.onCompleted(); } }); /** * 接着咱們建立一個Subscriber來處理Observable對象發出的字符串。 * */ Subscriber<String> mySubscriber = new Subscriber<String>() { @Override public void onCompleted() { Toast.makeText(LoginActivity.this, "完成啦...", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show(); } }; /** * 這裏subscriber僅僅就是打印observable發出的字符串。 * 經過subscribe函數就能夠將咱們定義的myObservable對象和mySubscriber對象關聯起來,這樣就完成了subscriber對observable的訂閱。 */ myObservable.subscribe(mySubscriber); } @Override protected void initListeners() { } @Override protected void initViews(Bundle savedInstanceState) { } @Override public void showMessagers(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); }