RxJava 响应式编程
Rxjava2入门教程五:Flowable背压支持——对Flowable最全面而详细的讲解
public class DemoActivity extends AppCompatActivity {
private final int count = 60;
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
textView = findViewById(R.id.textView);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testBackpressure24();
}
});
}
private Subscription mSubscription;
public void testBackpressure24() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
int n = 0;
while (true){
if (emitter.requested() == 0) continue;
emitter.onNext(n);
System.out.println("发射---->" + n);
n++;
}
}
}, BackpressureStrategy.MISSING)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new FlowableSubscriber() {
@Override
public void onSubscribe(Subscription s) {
System.out.println("onSubscribe----");
s.request(1);
mSubscription = s;
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(50L);
System.out.println("接收---->" + integer);
mSubscription.request(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable t) {
System.out.println("onError----");
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("onComplete----");
}
});
}
public void testBackpressure23() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + "开始发射数据" + System.currentTimeMillis());
for (int i = 1; i <= 500; i++) {
System.out.println(threadName + "发射---->" + i);
emitter.onNext(i);
try {
Thread.sleep(100);//每隔100毫秒发射一次数据
} catch (Exception ex) {
emitter.onError(ex);
}
}
System.out.println(threadName + "发射数据结束" + System.currentTimeMillis());
emitter.onComplete();
}
}, BackpressureStrategy.MISSING)
.onBackpressureLatest()
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
s.request(Integer.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(300);//每隔300毫秒接收一次数据
} catch (InterruptedException ignore) {
}
System.out.println(Thread.currentThread().getName() + "接收---------->" + integer);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println(Thread.currentThread().getName() + "接收----> 完成");
}
});
}
public void testBackpressure22() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + "开始发射数据" + System.currentTimeMillis());
for (int i = 1; i <= 500; i++) {
System.out.println(threadName + "发射---->" + i);
emitter.onNext(i);
try {
Thread.sleep(100);//每隔100毫秒发射一次数据
} catch (Exception ex) {
emitter.onError(ex);
}
}
System.out.println(threadName + "发射数据结束" + System.currentTimeMillis());
emitter.onComplete();
}
}, BackpressureStrategy.LATEST)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
s.request(Integer.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(300);//每隔300毫秒接收一次数据
} catch (InterruptedException ignore) {
}
System.out.println(Thread.currentThread().getName() + "接收---------->" + integer);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println(Thread.currentThread().getName() + "接收----> 完成");
}
});
}
public void testBackpressure21() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter e) throws Exception {
for (int i = 1; i <= 129; i++) { // 默认缓存大小是128
e.onNext(i);
}
e.onComplete();
}
}, BackpressureStrategy.ERROR)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE); //注意此处,暂时先这么设置
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(10000);
} catch (InterruptedException ignore) {
}
System.out.println(integer);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("接收----> 完成");
}
});
}
public void testOnBackpressure2() {
Flowable.range(1, 500)
// .onBackpressureLatest()
.onBackpressureDrop()
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
s.request(Integer.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(100);//每隔300毫秒接收一次数据
} catch (InterruptedException ignore) {
}
System.out.println(Thread.currentThread().getName() + "接收---------->" + integer);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println(Thread.currentThread().getName() + "接收----> 完成");
}
});
}
private void testOnBackpressure1() {
Flowable.range(1, 500)
// .map(new Function() {
// @Override
// public Integer apply(Integer integer) throws Exception {
// Log.e("TAG", "发射:" + integer);
// return integer;
// }
// })
.onBackpressureBuffer(5, new Action() {
@Override
public void run() throws Exception {
Log.e("TAG", "溢出");
}
}, BackpressureOverflowStrategy.DROP_OLDEST)
.observeOn(Schedulers.computation())
.subscribe(new FlowableSubscriber() {
@Override
public void onSubscribe(Subscription s) {
Log.e("TAG", "onSubscribe");
s.request(Integer.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(100);
Log.e("TAG", "接收" + integer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable t) {
Log.e("TAG", "onError");
t.printStackTrace();
}
@Override
public void onComplete() {
Log.e("TAG", "onComplete");
}
});
}
private void testPublish() {
PublishProcessor processor = PublishProcessor.create();
processor
.sample(1, TimeUnit.SECONDS)
.observeOn(Schedulers.computation(), false, 1024)
.subscribe(new FlowableSubscriber() {
@Override
public void onSubscribe(Subscription s) {
Log.e("TAG", "onSubscribe");
s.request(Integer.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(500);
Log.e("TAG", "onNext" + integer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable t) {
Log.e("TAG", "onError");
t.printStackTrace();
}
@Override
public void onComplete() {
Log.e("TAG", "onComplete");
}
});
for (int i = 0; i < 1_000; i++) {
processor.onNext(i);
}
}
private void testFlowable() {
Flowable.range(1, Integer.MAX_VALUE)
.observeOn(Schedulers.computation())
.subscribe(new FlowableSubscriber() {
@Override
public void onSubscribe(Subscription s) {
Log.e("TAG", "onSubscribe");
s.request(Integer.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
try {
Thread.sleep(1000);
Log.e("TAG", "onNext" + integer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable t) {
Log.e("TAG", "onError");
t.printStackTrace();
}
@Override
public void onComplete() {
Log.e("TAG", "onComplete");
}
});
}
private void testTo() {
Observable.range(1, 10)
.to(new Function, Single>() {
@Override
public Single apply(Observable integerObservable) throws Exception {
return integerObservable.count();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver() {
@Override
public void onSubscribe(Disposable d) {
Log.e("TAG", "onSubscribe");
}
@Override
public void onSuccess(Long aBoolean) {
Log.e("TAG", "onSuccess: " + aBoolean);
textView.setText(String.valueOf(aBoolean));
}
@Override
public void onError(Throwable e) {
Log.e("TAG", "onError");
e.printStackTrace();
}
});
}
private void testToMap() {
Observable.just(1, 2, 3, 4, 5, 6)
.toMap(Integer::toHexString)
// .toMultimap(Integer::toHexString)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver 


