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());
}
}
);
本文未完待續。