Rxjava功能操作符的使用方法详解
作者:Genten程泽翔 发布时间:2021-06-10 06:57:16
标签:rxjava,操作符
Rxjava功能个人感觉很好用,里面的一些操作符很方便,Rxjava有:被观察者,观察者,订阅者,
被观察者通过订阅者订阅观察者,从而实现观察者监听被观察者返回的数据
下面把Rxjava常用的模型代码列出来,还有一些操作符的运用:
依赖:
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
// Because RxAndroid releases are few and far between, it is recommended you also
// explicitly depend on RxJava's latest version for bug fixes and new features.
compile 'io.reactivex.rxjava2:rxjava:2.1.5'
这个是另一种解析数据的方法,阿里巴巴旗下的,听说是解析最快的解析器。。。。
compile 'com.alibaba:fastjson:1.2.39'
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import com.alibaba.fastjson.JSONObject;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import io.reactivex.FlowableEmitter;
import io.reactivex.FlowableOnSubscribe;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.BiFunction;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private TextView name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (TextView) findViewById(R.id.name);
//用来调用下面的方法,监听。
name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
interval();
}
});
}
//例1:Observer
public void observer() {
//观察者
Observer<string> observer = new Observer<string>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
//接收从被观察者中返回的数据
System.out.println("onNext :" + s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
//被观察者
Observable<string> observable = new Observable<string>() {
@Override
protected void subscribeActual(Observer<!--? super String--> observer) {
observer.onNext("11111");
observer.onNext("22222");
observer.onComplete();
}
};
//产生了订阅
observable.subscribe(observer);
}
//例2:Flowable
private void flowable(){
//被观察者
Flowable.create(new FlowableOnSubscribe<string>() {
@Override
public void subscribe(@NonNull FlowableEmitter<string> e) throws Exception {
for (int i = 0; i < 100; i++) {
e.onNext(i+"");
}
}
//背压的策略,buffer缓冲区 观察者
//背压一共给了五种策略
// BUFFER、
// DROP、打印前128个,后面的删除
// ERROR、
// LATEST、打印前128个和最后一个,其余删除
// MISSING
//这里的策略若不是BUFFER 那么,会出现著名的:MissingBackpressureException错误
}, BackpressureStrategy.BUFFER).subscribe(new Consumer<string>() {
@Override
public void accept(String s) throws Exception {
System.out.println("subscribe accept"+s);
Thread.sleep(1000);
}
});
}
//例3:线程调度器 Scheduler
public void flowable1(){
Flowable.create(new FlowableOnSubscribe<string>() {
@Override
public void subscribe(@NonNull FlowableEmitter<string> e) throws Exception {
for (int i = 0; i < 100; i++) {
//输出在哪个线程
System.out.println("subscribe Thread.currentThread.getName = " + Thread.currentThread().getName());
e.onNext(i+"");
}
}
},BackpressureStrategy.BUFFER)
//被观察者一般放在子线程
.subscribeOn(Schedulers.io())
//观察者一般放在主线程
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<string>() {
@Override
public void accept(String s) throws Exception {
System.out.println("s"+ s);
Thread.sleep(100);
//输出在哪个线程
System.out.println("subscribe Thread.currentThread.getName = " + Thread.currentThread().getName());
}
});
}
//例4:http请求网络,map转化器,fastjson解析器
public void map1(){
Observable.create(new ObservableOnSubscribe<string>() {
@Override
public void subscribe(@NonNull final ObservableEmitter<string> e) throws Exception {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://qhb.2dyt.com/Bwei/login")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
e.onNext(result);
}
});
}
})
//map转换器 flatmap(无序),concatmap(有序)
.map(new Function<string, bean="">() {
@Override
public Bean apply(@NonNull String s) throws Exception {
//用fastjson来解析数据
return JSONObject.parseObject(s,Bean.class);
}
}).subscribe(new Consumer<bean>() {
@Override
public void accept(Bean bean) throws Exception {
System.out.println("bean = "+ bean.toString() );
}
});
}
//常见rxjava操作符
//例 定时发送消息
public void interval(){
Observable.interval(2,1, TimeUnit.SECONDS)
.take(10)
.subscribe(new Consumer<long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println("aLong = " + aLong);
}
});
}
//例 zip字符串合并
public void zip(){
Observable observable1 = Observable.create(new ObservableOnSubscribe<string>() {
@Override
public void subscribe(@NonNull ObservableEmitter<string> e) throws Exception {
e.onNext("1");
e.onNext("2");
e.onNext("3");
e.onNext("4");
e.onComplete();
}
});
Observable observable2 = Observable.create(new ObservableOnSubscribe<string>() {
@Override
public void subscribe(@NonNull ObservableEmitter<string> e) throws Exception {
e.onNext("A");
e.onNext("B");
e.onNext("C");
e.onNext("D");
e.onComplete();
}
});
Observable.zip(observable1, observable2, new BiFunction<string,string,string>() {
@Override
public String apply(@NonNull String o, @NonNull String o2) throws Exception {
return o + o2;
}
}).subscribe(new Consumer<string>() {
@Override
public void accept(String o) throws Exception {
System.out.println("o"+ o);
}
});
}
来源:https://www.2cto.com/kf/201710/691536.html


猜你喜欢
- 主要讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法,具体内容详情如下所示:在Android Studio中
- 依然使用IE9的捕获参数,做了一个12306的登录功能。参照了网上童鞋们的做法。其他都和前面几篇读取余票、票价一样,不过登录要用到证书的问题
- 在Java中我们知道静态变量会在类加载时机的“初始化”阶段得到赋值(编译器会收集类中的静态变量及静态
- 本文实例讲述了Android开发实现Launcher3应用列表修改透明背景的方法。分享给大家供大家参考,具体如下:Launcher时开机完成
- 本文实例讲述了DevExpress中ChartControl实现柱状图演示的方法。分享给大家供大家参考。具体实现方法如下:关键代码如下:us
- 我们知道 Spring Boot 已经提供了一套默认的异常处理机制,但是 Spring Boot 提供的默认异常处理机制却并不一定适合我们实
- Spring Cache设置缓存条件原理从Spring3.1开始,Spring框架提供了对Cache的支持,提供了一个对缓存使用的抽象,通过
- 一般启动一个新的Activity都默认有切换的动画效果,比如界面从右至左的移动。但是有些时候我们不需要这个动画,怎么办?操作方法比较麻烦,这
- 扩展:由于server端是存储了所有server与client的连接对象,因此我们是可以基于此demo的基础上实现聊天系统:* 每当一个与用
- MyBatis resultMap id标签的错误使用我们在编写VO对象,如果业务场景稍微复杂一点,就会用到集合属性。例如用户查看个人订单列
- 前言我采用的是Camera来实现自定义相机的,如果你使用的是Camera2,那本文将不适用你。为了减少篇幅,本文主要讲解手动对焦的实现方式,
- 最近项目里涉及到自定义View的东西还是挺多的,所以打算在自定义View上多花点时间,也顺便分享给大家。先总结下自定义View的步骤:1、自
- AssertJ是我目前见过的最强大的断言api,没有之一。官网传送门为什么使用assertJ?1、流式断言,代码即用例,直观易懂。举个例子:
- 获取非公平锁(基于JDK1.7.0_40)非公平锁和公平锁在获取锁的方法上,流程是一样的;它们的区别主要表现在“尝试获取锁的机制不同”。简单
- 一、volatile作用可以保证多线程环境下共享变量的可见性通过增加内存屏障防止多个指令之间的重排序二、什么是可见性可见性是指当一个线程对于
- 一、Feign简介Feign是netflix开发的声明式、模板化的http客户端,在使用时就像调用本地(服务消费者自己)的方法一般,帮助我们
- 本文实例为大家分享了C#实现银行家算法的具体代码,供大家参考,具体内容如下1.死锁死锁,顾名思义,是一种锁住不可自行解开的死局。在操作系统中
- 1.准备工作1、JDK安装2、Maven安装3、Git安装4、jenkins安装以上软件安装成功后进入jenkins进行相关配置。如果需要通
- 过滤掉其他的播放器,使用我自己的播放器来做 wv.set
- 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的