rxjava2比1有什么差异?
如果说开发rxjava1的时候,作者只是个程序初哥,那么rxjava2的时候,作者已经是有点经验的人了,rxjava2的接口函数、类名的命名以及接口调用方式,都比rxjava1成熟不少,且更容易理解,逻辑也合理些。
flowable
数据/事件源增加了一个叫flowable的东西,和observable类似,都是把数据/事件推给订阅方进行处理。
特点如其名flowable,支持流控,采用backpressure的方式。
Observable的创建
这样:Observable.create(new ObservableOnSubscribe) 。
不再是rxjava1那种:Observable.create(new Observable.OnSubscribe);
其实上面的“OnSubscribe”,建议修改为“callBack”可能更好理解些。
看代码:
Observable.create(new ObservableOnSubscribe<Integer>() {
public void subscribe(ObservableEmitter<Integer> e)
{
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
})
响应/处理 数据/事件
看代码吧:
Observable dataSource = Observable.create(...);
dataSource.subscribe(new Observer<Integer>() {
private int i;
private Disposable mDisposable;
public void onSubscribe(Disposable d) { mDisposable = d; }
public void onNext(@NonNull Integer integer) {
i++;
if (i == 2)
mDisposable.dispose();
}
public void onError(Throwable e) { log(e.getMessage()); }
public void onComplete() { log("onComplete"); }
}
)
上面这种响应,有点复杂,可以用简单的!
例如:Consumer ,用于接收单个值,BiConsumer 则是接收两个值,Function 用于变换对象,Predicate 用于判断。
subscribeOn
指定数据/事件发射动作时候的线程。多次调用,以第一次的为准,后面的调用无效。
observeOn
指定订阅者处理数据/事件所在的线程。可以调用多次指定在不同线程做不同的数据/事件处理。
okhttp使用rxjava例子
Observable.create(new ObservableOnSubscribe<Response>()
{
public void subscribe(ObservableEmitter<Response> emitter) throws Exception
{
Request.Builder builder = new Request.Builder().url("http://api.test.com/?abc=123").get();
Request request = builder.build();
Call call = new OkHttpClient().newCall(request);
Response response = call.execute();
emitter.onNext(response);
}
})
.map(new Function<Response, HttpAPIResultObject>()
{
public HttpAPIResultObject apply(Response response) throws Exception
{
if (response.isSuccessful())
{
ResponseBody body = response.body();
if (body != null)
return new Gson().fromJson(body.string(), HttpAPIResultObject.class);
}
return null;
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<HttpAPIResultObject>()
{
public void accept(HttpAPIResultObject s) throws Exception
{
log("可以在这里做存储动作" + s.toString());
}
}
)
.subscribeOn(Schedulers.io()) // io线程处理网络过程
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<HttpAPIResultObject>()
{ // UI线程处理
public void accept(HttpAPIResultObject data) throws Exception
{
log("ui线程处理,可以在这里做界面相关操作" + data.toString());
}
}
,new Consumer<Throwable>()
{
public void accept(Throwable throwable) throws Exception
{
log("失败" + throwable.getMessage());
}
}
);
本文未完待续。