Androidモバイル開発におけるRxJavaの実戦応用その2
12686 ワード
応答プログラミングは非同期とデータストリームでトランザクション関係を構築するプログラミングモデルであり、非同期とデータストリームはトランザクション関係を構築するために存在し、非同期は関係のないトランザクションを区別するためであり、データストリームは関連するトランザクションに連絡するためである.
日文翻译:この文章はドアの心から竜のブログをくわえて、オリジナルの内容に属して、転載して出典を明記してくださいhttps://blog.csdn.net/geduo_83/article/details/89740000
文書ディレクトリ 1.簡単なネットワーク要求を実現する 2.キャッシュを読み出す、キャッシュにデータがない場合にネットワーク要求によりデータを取得した後、UI を更新する. 3.複数のネットワーク要求が に順次依存する. 4.複数のインタフェースを組み合わせたデータ更新UI 5.間隔タスクによる心拍数 の実現
1.簡単なネットワーク要求を実現する
2.キャッシュを読み込み、キャッシュにデータがない場合はネットワーク要求でデータを取得してUIを更新する
3.複数のネットワーク要求が順次依存する
4.複数のインタフェースを組み合わせたデータ更新UI
5.間隔タスクによる心拍数の実現
日文翻译:この文章はドアの心から竜のブログをくわえて、オリジナルの内容に属して、転載して出典を明記してくださいhttps://blog.csdn.net/geduo_83/article/details/89740000
文書ディレクトリ
1.簡単なネットワーク要求を実現する
Observable
.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
Builder builder = new Builder()
.url("http://api.avatardata.cn/MobilePlace/LookUp?key=ec47b85086be4dc8b5d941f5abd37a4e&mobileNumber=13021671512")
.get();
Request request = builder.build();
Call call = new OkHttpClient().newCall(request);
Response response = call.execute();
e.onNext(response);
}
})
.map(new Function() {
@Override
public MobileAddress apply(@NonNull Response response) throws Exception {
Log.e(TAG, "map :" + Thread.currentThread().getName() + "
");
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
Log.e(TAG, "map: :" + response.body());
return new Gson().fromJson(body.string(), MobileAddress.class);
}
}
return null;
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer() {
@Override
public void accept(@NonNull MobileAddress s) throws Exception {
Log.e(TAG, "doOnNext :" + Thread.currentThread().getName() + "
");
mRxOperatorsText.append("
doOnNext :" + Thread.currentThread().getName() + "
");
Log.e(TAG, "doOnNext: :" + s.toString() + "
");
mRxOperatorsText.append("doOnNext: :" + s.toString() + "
");
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(@NonNull MobileAddress data) throws Exception {
Log.e(TAG, "subscribe :" + Thread.currentThread().getName() + "
");
mRxOperatorsText.append("
subscribe :" + Thread.currentThread().getName() + "
");
Log.e(TAG, " :" + data.toString() + "
");
mRxOperatorsText.append(" :" + data.toString() + "
");
}
}, new Consumer() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
Log.e(TAG, "subscribe :" + Thread.currentThread().getName() + "
");
mRxOperatorsText.append("
subscribe :" + Thread.currentThread().getName() + "
");
Log.e(TAG, " :" + throwable.getMessage() + "
");
mRxOperatorsText.append(" :" + throwable.getMessage() + "
");
}
});
2.キャッシュを読み込み、キャッシュにデータがない場合はネットワーク要求でデータを取得してUIを更新する
Observable cache = Observable
.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
Log.e(TAG, "create :"+Thread.currentThread().getName() );
FoodList data = CacheManager.getInstance().getFoodListData();
// concat , onComplete Observable
if (data != null){ // , ,
isFromNet = false;
Log.e(TAG, "
subscribe: :" );
runOnUiThread(new Runnable() {
@Override
public void run() {
mRxOperatorsText.append("
subscribe: :
");
}
});
e.onNext(data);
}else {
isFromNet = true;
runOnUiThread(new Runnable() {
@Override
public void run() {
mRxOperatorsText.append("
subscribe: :
");
}
});
Log.e(TAG, "
subscribe: :" );
e.onComplete();
}
}
});
Observable network = Rx2AndroidNetworking.get("http://www.tngou.net/api/food/list")
.addQueryParameter("rows",10+"")
.build()
.getObjectObservable(FoodList.class);
// Observable
Observable
.concat(cache,network)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(@NonNull FoodList tngouBeen) throws Exception {
Log.e(TAG, "subscribe :"+Thread.currentThread().getName() );
if (isFromNet){
mRxOperatorsText.append("accept : :
");
Log.e(TAG, "accept : :
"+tngouBeen.toString() );
CacheManager.getInstance().setFoodListData(tngouBeen);
}
mRxOperatorsText.append("accept: :" + tngouBeen.toString()+"
");
Log.e(TAG, "accept: :" + tngouBeen.toString());
}
}, new Consumer() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
Log.e(TAG, "subscribe :"+Thread.currentThread().getName() );
Log.e(TAG, "accept: :"+throwable.getMessage() );
mRxOperatorsText.append("accept: :"+throwable.getMessage()+"
");
}
});
3.複数のネットワーク要求が順次依存する
Rx2AndroidNetworking.get("http://www.tngou.net/api/food/list")
.addQueryParameter("rows", 1 + "")
.build()
.getObjectObservable(FoodList.class) // , FootList
.subscribeOn(Schedulers.io()) // io
.observeOn(AndroidSchedulers.mainThread()) //
.doOnNext(new Consumer() {
@Override
public void accept(@NonNull FoodList foodList) throws Exception {
//
Log.e(TAG, "accept: doOnNext :" + foodList.toString());
mRxOperatorsText.append("accept: doOnNext :" + foodList.toString()+"
");
}
})
.observeOn(Schedulers.io()) // io
.flatMap(new Function>() {
@Override
public ObservableSource apply(@NonNull FoodList foodList) throws Exception {
if (foodList != null && foodList.getTngou() != null && foodList.getTngou().size() > 0) {
return Rx2AndroidNetworking.post("http://www.tngou.net/api/food/show")
.addBodyParameter("id", foodList.getTngou().get(0).getId() + "")
.build()
.getObjectObservable(FoodDetail.class);
}
return null;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(@NonNull FoodDetail foodDetail) throws Exception {
Log.e(TAG, "accept: success :" + foodDetail.toString());
mRxOperatorsText.append("accept: success :" + foodDetail.toString()+"
");
}
}, new Consumer() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
Log.e(TAG, "accept: error :" + throwable.getMessage());
mRxOperatorsText.append("accept: error :" + throwable.getMessage()+"
");
}
});
4.複数のインタフェースを組み合わせたデータ更新UI
Observable observable1 = Rx2AndroidNetworking.get("http://api.avatardata.cn/MobilePlace/LookUp?key=ec47b85086be4dc8b5d941f5abd37a4e&mobileNumber=13021671512")
.build()
.getObjectObservable(MobileAddress.class);
Observable observable2 = Network.getGankApi()
.getCategoryData("Android",1,1);
Observable.zip(observable1, observable2, new BiFunction() {
@Override
public String apply(@NonNull MobileAddress mobileAddress, @NonNull CategoryResult categoryResult) throws Exception {
return " : :"+mobileAddress.getResult().getMobilearea()+" :"+categoryResult.results.get(0).who;
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(@NonNull String s) throws Exception {
Log.e(TAG, "accept: :" + s+"
");
}
}, new Consumer() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
Log.e(TAG, "accept: :" + throwable+"
");
}
});
5.間隔タスクによる心拍数の実現
private Disposable mDisposable;
@Override
protected void doSomething() {
mDisposable = Flowable.interval(1, TimeUnit.SECONDS)
.doOnNext(new Consumer() {
@Override
public void accept(@NonNull Long aLong) throws Exception {
Log.e(TAG, "accept: doOnNext : "+aLong );
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(@NonNull Long aLong) throws Exception {
Log.e(TAG, "accept: :"+aLong );
mRxOperatorsText.append("accept: :"+aLong +"
");
}
});
}
/**
*
*/
@Override
protected void onDestroy() {
super.onDestroy();
if (mDisposable != null){
mDisposable.dispose();
}
}