RxJava

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();    }
相關文章
相關標籤/搜索