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();    }
相关文章
相关标签/搜索