MainActivity
package com.think.rxjava;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
protected Button btn1;
protected Button btn2;
protected Button btn3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
initView();
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn1) {
startActivity(new Intent(this, RxJavaDemo1Activity.class));
} else if (view.getId() == R.id.btn2) {
startActivity(new Intent(this, RxJavaDemo2Activity.class));
} else if (view.getId() == R.id.btn3) {
startActivity(new Intent(this, RxJavaDemo3Activity.class));
}
}
private void initView() {
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(MainActivity.this);
btn2 = (Button) findViewById(R.id.btn2);
btn2.setOnClickListener(MainActivity.this);
btn3 = (Button) findViewById(R.id.btn3);
btn3.setOnClickListener(MainActivity.this);
}
}
RxJavaDemo1Activity
package com.think.rxjava;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.example.demonstrate.DemonstrateUtil;
import com.example.demonstrate.DialogUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;
public class RxJavaDemo1Activity extends AppCompatActivity implements View.OnClickListener {
protected Button btnSend1;
protected Button btnSend2;
protected Button btnSend3;
protected Button btnSend4;
protected Button btnSend5;
protected Button btnSend6;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_rx_java_demo1);
initView();
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_send1) {
test1();//普通使用
} else if (view.getId() == R.id.btn_send2) {
test2();//链式调用
} else if (view.getId() == R.id.btn_send3) {
test3();//发送中,中断.
} else if (view.getId() == R.id.btn_send4) {
test4();//只关心onnext事件的操作
} else if (view.getId() == R.id.btn_send5) {
test5();//
} else if (view.getId() == R.id.btn_send6) {
test6();
}
}
private void test6() {
DialogUtil.showListDialog(this, "rxjava的操作符号使用", new String[]{
"0map()操作符",
"1flatMap()操作符",
"2filter()操作符",
"3take()操作符",
"4doOnNext()操作符",
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
map0();
break;
case 1:
map1();
break;
case 2:
map2();
break;
case 3:
map3();
break;
case 4:
map4();
break;
}
}
});
}
private void map4() {
Observable.just(new ArrayList(){
{
for (int i = 0; i < 6; i++) {
add("data"+i);
}
}
}).flatMap(new Function, ObservableSource>>() {
@Override
public ObservableSource> apply(List strings) throws Exception {
return Observable.fromIterable(strings);
}
}).take(5).doOnNext(new Consumer
RxJavaDemo2Activity
package com.think.rxjava;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.example.demonstrate.DemonstrateUtil;
import com.example.demonstrate.DialogUtil;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
public class RxJavaDemo2Activity extends AppCompatActivity implements View.OnClickListener {
protected Button btn;
protected ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_rx_java_demo2);
initView();
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn) {
DialogUtil.showListDialog(this, "rxJava操作!", new String[]{
"0发送事件io线程并变换主线程接收",
"1子线程发送事件主线程接收",
"2默认线程发送事件默认线程接收",
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
show0();
break;
case 1:
show1();
break;
case 2:
show2();
break;
}
}
});
}
}
private void show2() {
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
DemonstrateUtil.showLogResult("发送的线程名称:" + Thread.currentThread().getName());
DemonstrateUtil.showLogResult("发送的线程id:" + Thread.currentThread().getId());
DemonstrateUtil.showLogResult("发送的数据:" + 1);
e.onNext(1);
}
}).subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
DemonstrateUtil.showLogResult("接收的线程:" + Thread.currentThread().getName());
DemonstrateUtil.showLogResult("接收的线程id:" + Thread.currentThread().getId());
DemonstrateUtil.showLogResult("接收到的数据:-integer:" + integer);
}
});
}
private void show1() {
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
DemonstrateUtil.showLogResult("发送的线程名称:" + Thread.currentThread().getName());
DemonstrateUtil.showLogResult("发送的线程id:" + Thread.currentThread().getId());
DemonstrateUtil.showLogResult("发送的数据:" + 1);
e.onNext(1);
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
DemonstrateUtil.showLogResult("接收的线程:" + Thread.currentThread().getName());
DemonstrateUtil.showLogResult("接收的线程id:" + Thread.currentThread().getId());
DemonstrateUtil.showLogResult("接收到的数据:-integer:" + integer);
}
});
}
private void show0() {
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
DemonstrateUtil.showLogResult("所在的线程:", Thread.currentThread().getName());
DemonstrateUtil.showLogResult("发送的数据:", 1 + "");
e.onNext(1);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
DemonstrateUtil.showLogResult("所在的线程:", Thread.currentThread().getName());
DemonstrateUtil.showLogResult("接收到的数据:", "integer:" + integer);
}
});
}
private void initView() {
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(RxJavaDemo2Activity.this);
iv = (ImageView) findViewById(R.id.iv);
}
}
RxJavaDemo3Activity
package com.think.rxjava;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.example.demonstrate.DemonstrateUtil;
import com.example.demonstrate.DialogUtil;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
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.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
public class RxJavaDemo3Activity extends AppCompatActivity implements View.OnClickListener {
protected Button btnBackpressure;
private Flowable mFlowable;
private Subscriber mSubscriber;
private Subscription mSubscription;
private Flowable flowableLATEST;
private Subscriber subscriberLatest;
private Subscription subscriptionLatest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_rx_java_demo3);
initView();
init4();
init6();
}
private void init6() {
flowableLATEST = Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
for (int i = 1; i<=200; i++) {
emitter.onNext(i);
DemonstrateUtil.showLogResult("LATEST生产onNext:"+i);
}
}
}, BackpressureStrategy.LATEST);
//mSubscription = s;
subscriberLatest = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
subscriptionLatest = s;
s.request(100);
}
@Override
public void onNext(Integer integer) {
DemonstrateUtil.showLogResult("Latest消费onNext:" + integer);
}
@Override
public void onError(Throwable t) {
DemonstrateUtil.showLogResult("onError");
DemonstrateUtil.showLogResult(t.getMessage());
DemonstrateUtil.showLogResult(t.toString());
}
@Override
public void onComplete() {
DemonstrateUtil.showLogResult("onComplete");
}
};
}
private void init4() {
mFlowable = Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
for (int i = 1; i <= 200; i++) {
emitter.onNext(i);
DemonstrateUtil.showLogResult("生产onNext:"+i);
}
}
}, BackpressureStrategy.DROP);
//mSubscription = s;
mSubscriber = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
mSubscription = s;
s.request(100);
}
@Override
public void onNext(Integer integer) {
DemonstrateUtil.showLogResult("消费onNext:" + integer);
}
@Override
public void onError(Throwable t) {
DemonstrateUtil.showLogResult("onError");
DemonstrateUtil.showLogResult(t.getMessage());
DemonstrateUtil.showLogResult(t.toString());
}
@Override
public void onComplete() {
DemonstrateUtil.showLogResult("onComplete");
}
};
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_backpressure) {
DialogUtil.showListDialog(this, "Flowable的理解使用", new String[]{
"0事件堆积现象",
"1正常使用策略ERROR!",
"2使用策略ERROR出现的异常!",
"3使用策略BUFFER,更大的缓存池",
"4使用策略DROP,事件关联100",
"5使用策略DROP,再申请100",
"6使用策略LATEST,事件关联100",
"7使用策略LATEST,再申请100",
"8使用策略MISSING",
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
show0();
break;
case 1:
show1();
break;
case 2:
show2();
break;
case 3:
show3();
break;
case 4:
show4();
break;
case 5:
show5();
break;
case 6:
show6();
break;
case 7:
show7();
break;
case 8:
show8();
break;
}
}
});
}
}
private void show8() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
for (int i = 0; i < 200; i++) {
DemonstrateUtil.showLogResult("MISSING-生成emitter" + i);
emitter.onNext(i);
}
}
}, BackpressureStrategy.MISSING).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
//mSubscription = s;
//s.request(0);
}
@Override
public void onNext(Integer integer) {
DemonstrateUtil.showLogResult("MISSING-消费onNext" + integer);
}
@Override
public void onError(Throwable t) {
DemonstrateUtil.showLogResult("onError" + t.getMessage());
DemonstrateUtil.showLogResult("onError" + t.toString());
t.printStackTrace();
}
@Override
public void onComplete() {
DemonstrateUtil.showLogResult("onComplete");
}
});
}
private void show7() {
subscriptionLatest.request(100);
}
private void show6() {
flowableLATEST.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriberLatest);
}
private void show5() {
//128-100-100= -72.
mSubscription.request(100);
}
private void show4() {
mFlowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mSubscriber);
}
private void show3() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
for (int i = 0; i < 200; i++) {
DemonstrateUtil.showLogResult("emitter" + i);
emitter.onNext(i);
}
}
}, BackpressureStrategy.BUFFER).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
//mSubscription = s;
//s.request(0);
}
@Override
public void onNext(Integer integer) {
DemonstrateUtil.showLogResult("onNext" + integer);
}
@Override
public void onError(Throwable t) {
DemonstrateUtil.showLogResult("onError" + t.getMessage());
DemonstrateUtil.showLogResult("onError" + t.toString());
t.printStackTrace();
}
@Override
public void onComplete() {
DemonstrateUtil.showLogResult("onComplete");
}
});
}
private void show2() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
for (int i = 0; i < 200; i++) {
DemonstrateUtil.showLogResult("emitter" + i);
emitter.onNext(i);
}
}
}, BackpressureStrategy.ERROR).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
//mSubscription = s;
//s.request(0);
}
@Override
public void onNext(Integer integer) {
DemonstrateUtil.showLogResult("onNext" + integer);
}
@Override
public void onError(Throwable t) {
DemonstrateUtil.showLogResult("onError" + t.getMessage());
DemonstrateUtil.showLogResult("onError" + t.toString());
t.printStackTrace();
}
@Override
public void onComplete() {
DemonstrateUtil.showLogResult("onComplete");
}
});
}
private void show1() {
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
for (int i = 0; i < 127; i++) {//128
DemonstrateUtil.showLogResult("emitter " + i);
emitter.onNext(i);
}
DemonstrateUtil.showLogResult("emitter complete");
emitter.onComplete();
}
}, BackpressureStrategy.ERROR) //增加了一个参数,设置处理策略.
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
DemonstrateUtil.showLogResult("onSubscribe");
//用来向生产者申请可以消费的事件数量,这样我们便可以根据本身的消费能力进行消费事件.
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(Integer integer) {
DemonstrateUtil.showLogResult("onNext: " + integer);
}
@Override
public void onError(Throwable t) {
DemonstrateUtil.showLogResult("onError: " + t.getMessage());
DemonstrateUtil.showLogResult("onError: " + t.toString());
t.printStackTrace();
}
@Override
public void onComplete() {
DemonstrateUtil.showLogResult("onComplete: ");
}
});
}
private void show0() {
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
while (true) {
for (int i = 0; i < 129; i++) {
e.onNext(1);
}
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
Thread.sleep(5000);
DemonstrateUtil.showLogResult("接受到" + integer);
}
});
}
private void initView() {
btnBackpressure = (Button) findViewById(R.id.btn_backpressure);
btnBackpressure.setOnClickListener(RxJavaDemo3Activity.this);
}
}
GetBitmapForURL
package com.think.rxjava;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
/**
* Created by think on 2017/11/28.
*/
public class GetBitmapForURL {
public static Bitmap getBitmap(String url) {
//获取传进来的参数
Bitmap bitmap = null;
URLConnection connection;
InputStream is;
BufferedInputStream bis;
try {
connection = new URL(url).openConnection();
is = connection.getInputStream();
//为了更清楚的看到加载图片的等待操作,将线程休眠2秒钟
Thread.sleep(2000);
bis = new BufferedInputStream(is);
//通过decodeStream方法解析输入流
bitmap = BitmapFactory.decodeStream(bis);
is.close();
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
}
MyObserver
package com.think.rxjava;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
* Created by think on 2017/11/29.
*/
public class MyObserver implements Observer {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}