RxJava2使用归纳总结

1. 基础理论

  RXJava角色划分:
       observale: 被观察者
       observer: 观察者   子类Subject【科目】  回调走的是观察者
   subscribe: 订阅
       被观察者.订阅(观察者),被观察者通知观察者
  被观察者类型: 
       热: 订阅完毕立即发送数据
       冷: 创建以后,等待观察者订阅,
       一旦订阅了,才发送数据

2. 基础Api使用        订阅、取消订阅

1. 1.添加依赖:

 compile 'io.reactivex.rxjava2:rxjava:2.0.8'       //RxJava 的jar包
 compile 'io.reactivex.rxjava2:rxandroid:2.0.1'   // RxJava对安卓支持

1.2.Observer 使用

 public void showDemo(View view) {
        //1. 创建被观察者
        //  一旦订阅,调用观察者的  onSubscribe方法
        Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {

            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                // 调用 观察者的 onNext 方法
                // 观察者 通知被 观察者 调用 onNext 方法
                e.onNext("健身");
                e.onNext("我要大保健");
                e.onNext("去酒吧");
                e.onComplete(); // 大保健完成
                //   e.onError(new Throwable("错误"));
            }
        });
     // 2. 创建观察者
        Observer<String> observer=new Observer<String>() {
            Disposable dd;
            @Override
            public void onSubscribe(Disposable d) {
                Log.e("denganzhi","onSubscribe");
                dd= d;
            }

            @Override
            public void onNext(String s) {
                // 取消订阅
                if(s.contains("大保健")){
                    dd.dispose();
                }
                Log.e("denganzhi1","onNext:"+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.e("denganzhi","onError");
            }

            @Override
            public void onComplete() {
                Log.e("denganzhi","onComplete");
            }
        };
        //  3. 订阅
        observable.subscribe(observer);
    }

Observable调用了e.onNext方法:健身
Observable调用了e.onNext方法:我要大保健

 1.3.Consumer 的 Observer 子类,避免实现过多方法

  // 1.第一步:创建被观察者
        Observable<String> observable= Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                e.onNext("健身");
                e.onNext("我要大保健");
                e.onNext("去酒吧");
                e.onComplete(); // 大保健完成
            }
        });
		  // 简单的用法
        // Consumer 是 Observer的子类
        observable.subscribe(new Consumer<String>() {
            @Override
            public void accept(@NonNull String s) throws Exception {
                Log.e("denganzhi1","accept-->onNext:"+s);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(@NonNull Throwable throwable) throws Exception {

            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                Log.e("denganzhi1","accept-->onComplete");
            }
        });

accept-->onNext:健身
accept-->onNext:我要大保健
accept-->onNext:去酒吧
accept-->onComplete

   2. 数据发送Api

  // 发送一条数据或者多条数据 
 //   Observable<String> observable1= Observable.just("上网","大保健","回家");
 //  发送Array
        Observable<String> observable1= Observable.fromArray("上网","大保健","回家");
        observable1.subscribe(new Consumer<String>() {
            @Override
            public void accept(@NonNull String s) throws Exception {
                Log.e("denganzhi1","just--》"+s);
            }
        });

3 RxJava 冷的Subject

 Subject 它是一个Observer 也可以做为 Subject订阅的一个Observable
 Subject实现:
 PublishSubject publishSubject;
 
  订阅以后不会直接调用onNext方法,必须要手动调用 publishSubject.onNext("hello")
  才回调 subscribe的 onNext方法

 3.1. PublishSubject,订阅以后不会直接调用onNext方法,必须要手动调用 publishSubject.onNext("hello");

    3.1.1.创建 PublishSubject

PublishSubject publishSubject;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cold);
		  // 冷的,订阅以后不会直接调用onNext方法,必须要手动调用 publishSubject.onNext("hello");
        publishSubject =PublishSubject.create();
		}

    3.1.2. 订阅  onSubscribe方法调用

  public  void  code_subscribe(View view){
   // 冷的,分开2步实现
        // 1. 订阅 subscribe  2. 发送 onNext
        publishSubject.subscribe(new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG,"onSubscribe");
            }
            @Override
            public void onNext(Object o) {
                Log.e(TAG,"onNext:"+(String)o);
            }
            @Override
            public void onError(Throwable e) {
                Log.e(TAG,"onError");
            }
            @Override
            public void onComplete() {
                Log.e(TAG,"onComplete");
            }
        });
  }

 E/denganzhi1: onSubscribe   

3.1.3. 被观察这通知观察着

	    public  void  code_send(View view){
// PublishSubject 使用
         publishSubject.onNext("PublishSubject-->OnNext");
		 
		 }

 输出 :

onNext:PublishSubject-->OnNext     

3.2. BehaviorSubject 默认值,订阅以后会默认调用onNext方法

3.2.1. 创建 BehaviorSubject

 BehaviorSubject<String> behaviorSubject;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cold);
		    // 冷的,默认值,订阅以后会默认调用onNext方法
        behaviorSubject= BehaviorSubject.createDefault("默认发送");
		}
		
		  public  void  code_subscribe(View view){

   // 冷的,分开2步实现
   // 订阅以后会调用  
         behaviorSubject.subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG, "onSubscribe......onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "onNext......onNext:"+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError......onError");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "完成......onComplete");
            }
        });

输出:

 //onSubscribe......onSubscribe
    // onNext......onNext:默认发送,订阅以后默认调用onNext方法

  3.2.2. 订阅:

  public  void  code_subscribe(View view){
   behaviorSubject.subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG, "onSubscribe......onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "onNext......onNext:"+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError......onError");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "完成......onComplete");
            }
        });


  }

  3.2.3. 发送:

// 手动调用
	    public  void  code_send(View view){
		  behaviorSubject.onNext("BehaviorSubject...BehaviorSubject");
		}

// onNext......onNext:BehaviorSubject...BehaviorSubject        

3.3.ReplaySubject 会把每次发送给观察者的数据缓存起来,一旦有新的观察者订阅,会立刻把缓存中的消息发送给对应观察者

        3.3.1. 创建ReplaySubject

   ReplaySubject<String> replaySubject;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cold);
		  // 会把每次发送给观察者的数据缓存起来,一旦有新的观察者订阅,会立刻把缓存中的消息发送给对应观察者
        replaySubject= ReplaySubject.create();
		}

 3.3.2. 第一次订阅: 

 public  void  code_subscribe(View view){	
		// 订阅1
        replaySubject.subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG, "onSubscribe111");
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "onNext:"+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "Throwable:");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "onComplete:");
            }
        });
		}

E/denganzhi1: onSubscribe

3.3.3. 发送

  public  void  code_send(View view){
		replaySubject.onNext("ReplaySubject ... 测试");
		}

onNext:ReplaySubject ... 测试
        3.3.4. 第二次订阅

 public void re_code_subscribe(View view){
        // 订阅2 : 再次订阅,会发送之前订阅的消息
        replaySubject.subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG, "re========>onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "re========>onNext:"+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "re========>Throwable:");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "re========>onComplete:");
            }
        });
    }


        re========>onSubscribe
        re========>onNext:ReplaySubject ... 测试    // 把第一次发送的缓存起来,第二次发送,也可以接受第一次的

      

 3.4. AsyncSubject 多个onNext发送调用,只能收到最后一个onNext,方法以后必须要调用onComplete();

3.4.1 创建AsyncSubject

	1. 创建AsyncSubject
    AsyncSubject<String> asyncSubject;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cold);
		 //1. 调用onNext方法以后必须要调用onComplete();
        //2. 多个onNext发送调用,只能收到最后一个onNext
        asyncSubject= AsyncSubject.create();

		}

3.4.2  订阅:

	 public  void  code_subscribe(View view){
		 asyncSubject.subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG, "onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Log.e(TAG, "onNext:"+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "Throwable:");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "onComplete:");
            }
        });
		}

 E/denganzhi1: onSubscribe
   3.4.3  发送:

3.  public  void  code_send(View view){
		  asyncSubject.onNext("asyncSubject测试1");
        asyncSubject.onNext("asyncSubject测试2");
        asyncSubject.onNext("asyncSubject测试3");
        asyncSubject.onComplete();
        }

denganzhi1: onNext:asyncSubject测试3      // 多次调用onNext,在调用onComplete以后,只调用一次onNext
 denganzhi1: onComplete:

4.  RxJava 案例: 实现类似EventBus功能:

情景: 服务中不断收到蓝牙会的数据,然后发送到 订阅的各个Activity, Activity会以后如何取消订阅

1. MyApplication  启动 MyService 服务

 // 启动 MyService 服务
  public class MyApplciaton extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Intent intent=new Intent(this,MyService.class);
        startService(intent);
    }
   }

2.  MyService中实现,蓝牙数据上报接口数据

package lanya.denganzhi.com.rxjava2;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

import io.reactivex.subjects.PublishSubject;

public class MyService extends Service {
    public MyService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
     String TAG="denganzhi";
    @Override
    public void onCreate() {
        Log.e(TAG,"onCreate");
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG,"onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    private PublishSubject<String> dataChangeSubject = PublishSubject.create();
    public PublishSubject<String> listeneDataChange() {
        return dataChangeSubject;
    }
   
   // 蓝牙的所有数据上报到这个接口
    public  void publish(final String topic, final String msg) {
        //  向订阅PublishSubject 的主题发送
        dataChangeSubject.onNext("蓝牙发送cmd"+0x08);
    }
    private static MyService rxMqtt;
    /**
     *  获取Service  实例
     * @return
     */
    public static MyService getRxMqtt() {
        if (rxMqtt == null) {
            synchronized (MyService.class) {
                if (rxMqtt == null) {
                    rxMqtt = new MyService();
                }
            }
        }
        return rxMqtt;
    }
}

  3. MainActivity  订阅 dataChangeSubject 

  String TAG="denganzhi";
    Disposable serviceDisposable;
    // 订阅在当前Activity
    public void showDemo(View view) {
        // 需要的时候才订阅,每次使用取消订阅,如果要一直订阅,那就不要取消了
        toDisposable(serviceDisposable);
        serviceDisposable= MyService.getRxMqtt().listeneDataChange()
                .filter(new AppendOnlyLinkedArrayList.NonThrowingPredicate<String>() {
                    @Override
                    public boolean test(String s) {
                        return true;
                    }
                })
          .timeout(5 * 1000, TimeUnit.MILLISECONDS)    
          .subscribe(new Consumer<String>() {
                                 @Override
                                 public void accept(String s) throws Exception {
                                Log.e(TAG,"listeneDataChange-->accept:"+s);
                                 }
                             }, new Consumer<Throwable>() {
                                 @Override
                                 public void accept(Throwable throwable) throws Exception {
                                     Log.e(TAG,"listeneDataChange-->Consumer");
                                 }
                             }

                );
        compositeDisposable.add(serviceDisposable);
    }

    public void toDisposable(Disposable disposable) {
        if (disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
    }

    @Override
    protected void onDestroy() {
        toDisposable(serviceDisposable);
        super.onDestroy();
    }

 4. 模拟数据上报,接收数据,模拟蓝牙发送 Activity中的Button

public void sendDemo(View view) {
        MyService.getRxMqtt().publish("/push/topic","蓝牙发送数据....");
    }

  运行效果 :  MainActivity中的subscribe 订阅中回调接收数据

 listeneDataChange-->accept:蓝牙发送cmd8
 listeneDataChange-->accept:蓝牙发送cmd8
 listeneDataChange-->accept:蓝牙发送cmd8
 listeneDataChange-->accept:蓝牙发送cmd8

5.  RxJava操作符:

5.1.  RxJava操作符,数组相关的:
  Observable.just("上网","大保健","回家");
fromIterable : 遍历List
      *** Observable.fromArray("上网","大保健","回家");   // 数据遍历器
          配合使用:  .take(2) 取前2条        firstElement【第一条】        
                      .takeLast  去最后2条     lastElement【最后一条】
                      .distinct()  过滤掉Array中重复数据
                       .skip(2)    跳过Array中1,2个元素,从第3个开始
                       skipLast(2)    最后2个不需要
                         .elementAt(2): 只有第3个元素
                          .elementAt(10,"小明"): 发送如果角标越结,发送默认的"小明"
                          .range(5,5):  从数据角标5位置开始发送5次
      filter:  过滤                  
         
  5.2.Observale 操作符与重复相关: 
      repeat(2) :  被观察这 发送2次
      defer: 懒加载,当观察者订阅,才去创建Observable
      interval: 每隔3s调用一次 onNext
      timer: 定时器,3s以后执行一次
 intervalRange(100,3,3,3,TimeUnit.SECONDS):从100开始,执行3次,第一个3s后执行,每次间隔3s  输出100 101 102
        .timeout(5 * 1000, TimeUnit.MILLISECONDS): 超时
        
         Observable.empty():  //会调用 onSubscribe  和 onComplete 方法
   

  private Observable<String> observableString;
    public  void testRxJava(View view){
        //   observable.repeat():
        //  repeat(2) :  被观察这 发送2次
        Observable.just("xiaoming","xiaohei")
                .repeat(2)                     // 发送2次
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                      //  Log.e(TAG,"内容是:"+s);
                    }
                });

        // defer(): 当观察者订阅,才去创建Observable  懒加载
        Observable observable1=Observable.defer(new Callable<ObservableSource<?>>() {
            @Override
            public ObservableSource<?> call() throws Exception {
                return Observable.create(new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                        e.onNext("下一步");
                        e.onComplete();
                    }
                });
            }
        });
        observable1.subscribe(new Consumer() {
            @Override
            public void accept(@NonNull Object o) throws Exception {
            //   Log.e("denganzhi1","结果是:"+(String)o);
            }
        });


        // 从开始位置开始发送,向后发送多少个
        // 打印5,6,7,8,9
        Observable.range(5,5)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                   //    Log.e("denganzhi1","result:"+integer);
                    }
                });

       //  第一个:
        // 第二个参数:
        // 第三个:用到的单位
        // 无限轮训
       Observable observable_interval= Observable.interval(3,TimeUnit.SECONDS);
       Observer<Long> observer=new Observer<Long>() {

           Disposable dd;
           @Override
           public void onSubscribe(Disposable d) {
               this.dd=d;
           }

           @Override
           public void onNext(Long s) {
            //    Log.e(TAG,"result:"+s);  // 这里返回 s  从0 开始 1,2,3,4
          if(s==5){
              dd.dispose();
            }
           }

           @Override
           public void onError(Throwable e) {

           }

           @Override
           public void onComplete() {

           }
       };
        observable_interval.subscribe(observer);


        //(long start, long count, long initialDelay, long period, TimeUnit unit)
        // 从100开始,执行3次,第一个3s后执行,每次间隔3s
        Observable.intervalRange(100,3,3,3,TimeUnit.SECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(@NonNull Long aLong) throws Exception {
                       // Log.e(TAG,"result:"+aLong);
                    }
                });

        // 隔开4S执行一次
        Observable.timer(4,TimeUnit.SECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(@NonNull Long aLong) throws Exception {
                      //  Log.e(TAG,"result:"+aLong);
                    }
                });


        // 过滤  filter
        User u1=new User(1,"小明");
        User u2=new User(2,"xiaohei");
        Observable.just(u1,u2)
                  .filter(new Predicate<User>() {
                      @Override
                      public boolean test(@NonNull User user) throws Exception {
                          // 数据遍历,返回需要数据
                          return user.getUsername().contains("小");
                      }
                  }).subscribe(new Consumer<User>() {
            @Override
            public void accept(@NonNull User user) throws Exception {
           //     Log.e(TAG,"过滤以后的结果是:"+user.getUsername());
            }
        });


         Observable.fromArray("xiaoming","xiaohei","a","b").filter(new AppendOnlyLinkedArrayList.NonThrowingPredicate<String>() {
             @Override
             public boolean test(String s) {
                 return true;
             }
         })
                 .take(2).subscribe(new Consumer<String>() {
             @Override
             public void accept(String s) throws Exception {
               //  Log.e("filte-->"+TAG,s);
             }
         });


        Observable.fromArray("xiaoming","xiaohei","a","b").filter(new AppendOnlyLinkedArrayList.NonThrowingPredicate<String>() {
            @Override
            public boolean test(String s) {
                return true;
            }
        })
                .takeLast(2).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
              //  Log.e("filte-->"+TAG,s);
            }
        });


        Observable.fromArray("xiaoming","xiaohei","a","a","a").distinct()
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                      //  Log.e("distinct-->"+TAG,s);
                    }
                });



        Observable.fromArray("xiaoming","xiaohei","a","a","a")
                .firstElement()
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                    //    Log.e("firstElement-->"+TAG,s);
                    }
                });


        // skip(n): 跳过前面2个
        Observable.just("xiaoming","小黑","xiaoming3")
                .skipLast(2)
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                   //    Log.e(TAG,"skip:"+s);
                    }
                });



        // 过滤重复数据
        Observable.just("xiaoming","小黑","xiaoming")
                .distinct()
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                    //    Log.e(TAG,s);
                    }
                });


        Observable.fromArray("xiaoming1","xiaohei2","3","4","5")
                .elementAt(10,"小明")
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                         //   Log.e("elementAt-->"+TAG,s);
                    }
                });


        // 会调用 onSubscribe  和 onComplete 方法
        Observable.empty().subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e(TAG,"onSubscribe");
            }
            @Override
            public void onNext(Object o) {
                Log.e(TAG,"onNext");
            }
            @Override
            public void onError(Throwable e) {
                Log.e(TAG,"onError");
            }
            @Override
            public void onComplete() {
                Log.e(TAG,"onComplete");
            }
        });
    }

 5.3. RxJava 变化操作符 Map、flatMap 变化符使用,数据变换

功能: 比如 把 Integer 变成 User 在变成  String

   //RxJava变化操作符使用
    public void showDemo3(View view){
        // id(Intger) --> User
        // Function<Integer, User>  第一个是参数 ,第二个是函数返回结果
        Observable.just(400).map(new Function<Integer, User>() {
            @Override
            public User apply(Integer integer) throws Exception {
                    return new User(integer,"xiaoming");
            }
        }).subscribe(new Consumer<User>() {
            @Override
            public void accept(User user) throws Exception {
             Log.e(TAG,"转化之后的值:"+user);
            }
        });


        // 根据id获取token
        // 根据token获取用户信息
        //可以不断的做下去,不断的封装数据
        // Function<Integer, ObservableSource<User>>  第一参数,第二个返回值
        Observable.just(100).flatMap(new Function<Integer, ObservableSource<User>>() {
            @Override
            public ObservableSource<User> apply(Integer integer) throws Exception {
                return Observable.just(new User(integer,"xiaoming"));
            }
        }).flatMap(new Function<User, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(User user) throws Exception {
                return Observable.just(user.getUsername());
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG,"result:"+s);
            }
        });
}

    6. RxJava组合方法:

1. Merge 顺序触发,首先执行observal1,在执行observal2
 Merge observal1 抛出异常,那么不会执行  observal2,使用mergeDelayError‘’

        Observable<String> observable_1= Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                //      int j=1/0;、
                Log.e(TAG,"组合1触发了");
                SystemClock.sleep(5000);
                int i=1/0;
                e.onNext("组合1");
                //  Log.e(TAG,"组合1");
            }
        });


        Observable<String> observable_2= Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                Log.e(TAG,"组合2触发了");
                SystemClock.sleep(3000);
                e.onNext("组合2");
                //  Log.e(TAG,"组合2");
            }
        });

//  observable_1 执行完毕,在执行 observable_2 有顺序
    Observable.mergeDelayError(observable_1,observable_2).subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            Log.e(TAG, "mergeDelayError:" + s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            Log.e(TAG, "concat:" +throwable);
        }
    });

输出:        
 组合1触发了
 组合2触发了
 mergeDelayError:组合2

        2. concat: observal1 执行, observal2没有执行
        3. zip     首先执行observal1,在执行observal2,然后 1,2 整合 BiFunction

     Observable<String> observable_1= Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                //      int j=1/0;、
                Log.e(TAG,"组合1触发了");
                SystemClock.sleep(5000);
                int i=1/0;
                e.onNext("组合1");
                //  Log.e(TAG,"组合1");
            }
        });
        Observable<String> observable_2= Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                Log.e(TAG,"组合2触发了");
                SystemClock.sleep(3000);
                e.onNext("组合2");
                //  Log.e(TAG,"组合2");
            }
        });
        Observable.zip(observable_1, observable_2, new BiFunction<String, String, String>() {
            @Override
            public String apply(String s1, String s2) throws Exception {
                return s1+s2;
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.e(TAG,"zip:"+s);
                    }
                });

输出:
组合1触发了
组合2触发了
zip:组合1组合2

   Zip数据合并:
 

 List<String> list1= Arrays.asList("a","b","c");
        List<String> list2= Arrays.asList("1","2","3");
        // 输出list
        Observable.fromIterable(list1).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
              //  Log.e(TAG,"fromIterable:"+s);
            }
        });
    // 数据合并
        Observable.zip(Observable.fromIterable(list1),
                Observable.fromIterable(list2),
                new BiFunction<String, String, String>() {
            @Override
            public String apply(String s, String s2) throws Exception {
                return  s+s2;
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
           //     Log.e(TAG,"zip:"+s);
                /**
                 *      E/denganzhi: zip:a1
                        E/denganzhi: zip:b2
                        E/denganzhi: zip:c3
                 */
            }
        });

7. RxJava 线程切换: 

RxJava 线程切换: 
Schedulers.newThread():   总是启动新线程执行操作
.subscribeOn(Schedulers.io()): 行为模式和newThread()差不多,区别在与Schedulers.io内部有线程池,可以重用
observeOn(AndroidSchedulers.mainThread()):  Aroid提供切换到UI线程         

    线程控制函数subscribeOn 指定事件创建者线程, 可以左右于它前后的代码,直到observeOn 才结束,切换新线程
    observeOn:  执行观察着线程,只能作用于它之后的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值