zoukankan      html  css  js  c++  java
  • RxJava总结(原)

    1、RxJava的作用  

        RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.

        It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away   concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.

        说白了就是大家都说的让你能一眼看出来你之前做什么,之后做什么。它不是简化了代码,而是简化了逻辑。它具有线程安全性。

    2、RxJava的原理

       RxJava是基于观察者模式的。用户定义Observer之后,提供一个Observerble,由Observerble进行subscribe,就安心等待结果就行。

       RxJava可以进行事件的排序操作,使用了decorate设计模式和拦截器模式进行操作。在操作的过程中将过程大量的封装为OnSubscribe对象,配合Scheduler完成包装。

      

    使用下面一行代码开启循环调用,直至完成事件。

        

    Subscriber<? super T> st = hook.onLift(operator).call(o);
    try {
        // new Subscriber created and being subscribed with so 'onStart' it
        st.onStart();
        onSubscribe.call(st);
    } catch (Throwable e) {
        ...
    }
    

     

    3、RxJava的实现

      

    4、RxJava的流程

      

    5、RxJava的使用

       5.1 简单的使用

        5.1.1 创建观察者

        5.1.2 创建被观察者

        5.1.3 调用subscribe方法进行订阅。

    private void subscribe1() {
            //创建一个观察者
            Observer<String> observer = new Observer<String>() {
    
                @Override
                public void onCompleted() {
                    Log.i(TAG, "Completed");
                }
    
                @Override
                public void onError(Throwable e) {
                    Log.i(TAG, "Error");
                }
    
                @Override
                public void onNext(String s) {
                    Log.i(TAG, s);
                }
            };
            //使用Observable.create()创建被观察者
            Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    subscriber.onNext("Hello");
                    subscriber.onNext("Wrold");
                    subscriber.onCompleted();
                }
            });
            //订阅
            observable1.subscribeOn(Schedulers.newThread()).observeOn(Schedulers.io()).doOnNext(new Observable.OnSubscribe() {
                @Override
                public void call(Object o) {
                    System.out.println(o.toString());
                }
            }).subscribe(observer);
        }
    

      5.2 Retrofit和RxJava的配合:Retrofit和RxJava配合使用时,Retrofit的CallAdapter使用RxJavaCallAdapterFactory生成返回值为Observable<T>的对象。使用该对象进行subscribe操作即可。    

        5.2.1 定义返回数据      

    public class UserInfo {
        public String username;
        public String password;
    }

        5.2.2 定义接口,返回值为Observable<T>,即为被观察者对象

    interface MyService {
        @GET("user/login")
        Observable<UserInfo> login(
                @Query("username") String username,
                @Query("password") String password
        );
    }

        5.2.3 生成Retrofit对象,配置CallAdapterFactory为RxJavaCallAdapterFactory。

    Retrofit retrofit = new Retrofit.Builder()
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//新的配置
                    .baseUrl(BASE_URL)
                    .build();

        5.2.4 生成代理类,即被观察者

    MyService service = retrofit.create(MyService.class);

        5.2.5 配置事件链和Scheduler,订阅;

    String phone = "123";
            String password = "123";
            service.login(phone, password)               //获取Observable对象
                    .subscribeOn(Schedulers.newThread())//请求在新的线程中执行
                    .observeOn(Schedulers.io())         //请求完成后在io线程中执行
                    .doOnNext(new Action1<UserInfo>() {
                        @Override
                        public void call(UserInfo userInfo) {
                            saveUserInfo(userInfo);//保存用户信息到本地
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())//最后在主线程中执行
                    .subscribe(new Subscriber<UserInfo>() {
                        @Override
                        public void onCompleted() {
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            //请求失败
                        }
    
                        @Override
                        public void onNext(UserInfo userInfo) {
                            //请求成功
                        }
                    });
  • 相关阅读:
    ARP 协议
    天梯赛L1 题解
    DNS域名系统
    LeetCode 三角形最小路径和
    sql注入漏洞的利用
    XSS漏洞防御
    忘记密码功能漏洞挖掘
    sql bypass
    Web环境搭建组合
    常用数据库的总结
  • 原文地址:https://www.cnblogs.com/weizhxa/p/9769985.html
Copyright © 2011-2022 走看看