RX+Retrofit 从服务器响应过滤数据
RX+Retrofit filtring data from server Response
如何在特定条件下使用 RxJava 函数 .filter(),我想要
只有 id 为 168 的数据,
这是正确的做法还是必须改变我的代码风格给我你宝贵的建议。 (没有 RetroLambda 使用 :))
NetworkRequest networkRequest = new NetworkRequest(this);
RestApi api = networkRequest.getInstance().create(RestApi.class);
subscription = api
.school()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<SchoolList>>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: completed");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: on Error");
e.printStackTrace();
}
@Override
public void onNext(Response<SchoolList> schoolResponse) {
Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size());
}
});
i have response like
{ "schoolList": [
{
"name": "A University",
"id": "168"
},
{
"name": "Alba Sciences",
"id": "271"
},
{
"name": "B University",
"id": "168"
}]
}
i have try this way but getting noting in (On Next)
NetworkRequest networkRequest = new NetworkRequest(this);
RestApi api = networkRequest.getInstance().create(RestApi.class);
subscription = api
.school()
.filter(new Func1<Response<SchoolList>, Boolean>() {
@Override
public Boolean call(Response<SchoolList> schoolListResponse) {
Log.d(TAG, "condition: computing 2");
return schoolListResponse.getSchoolList().get(0).getId().equals("168");
}
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<SchoolList>>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: completed");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: on Error");
e.printStackTrace();
}
@Override
public void onNext(Response<SchoolList> schoolResponse) {
Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size());
}
});
我认为你应该能够使用类似下面的东西(强烈建议在使用 RxJava 时使用 RetroLambda(或准备好 Jack))
api.school()
.flatMapIterable(schoolResponse -> schoolResponse.getSchoolList())
.filter(school -> school.getId().equals("168"))
.toList()
使用 FlatMap Operator schoolItem 查看您选择的项目
api.school().flatMap(new Func1<SchoolListResponse, Observable<SchoolItem>>() {
@Override
public Observable<SchoolItem> call(SchoolListResponse schoolListResponse) {
return Observable.from(schoolListResponse.getSchoolList());
}
}).filter(new Func1<SchoolItem, Boolean>() {
@Override
public Boolean call(SchoolItem schoolItem) {
return schoolItem.getId().equals("168");
}
}).subscribe(new Subscriber<SchoolItem>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(SchoolItem schoolItem ) {
//schoolItem Filtered Item
}
});
如何在特定条件下使用 RxJava 函数 .filter(),我想要 只有 id 为 168 的数据, 这是正确的做法还是必须改变我的代码风格给我你宝贵的建议。 (没有 RetroLambda 使用 :))
NetworkRequest networkRequest = new NetworkRequest(this);
RestApi api = networkRequest.getInstance().create(RestApi.class);
subscription = api
.school()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<SchoolList>>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: completed");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: on Error");
e.printStackTrace();
}
@Override
public void onNext(Response<SchoolList> schoolResponse) {
Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size());
}
});
i have response like
{ "schoolList": [
{
"name": "A University",
"id": "168"
},
{
"name": "Alba Sciences",
"id": "271"
},
{
"name": "B University",
"id": "168"
}]
}
i have try this way but getting noting in (On Next)
NetworkRequest networkRequest = new NetworkRequest(this);
RestApi api = networkRequest.getInstance().create(RestApi.class);
subscription = api
.school()
.filter(new Func1<Response<SchoolList>, Boolean>() {
@Override
public Boolean call(Response<SchoolList> schoolListResponse) {
Log.d(TAG, "condition: computing 2");
return schoolListResponse.getSchoolList().get(0).getId().equals("168");
}
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<SchoolList>>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: completed");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: on Error");
e.printStackTrace();
}
@Override
public void onNext(Response<SchoolList> schoolResponse) {
Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size());
}
});
我认为你应该能够使用类似下面的东西(强烈建议在使用 RxJava 时使用 RetroLambda(或准备好 Jack))
api.school()
.flatMapIterable(schoolResponse -> schoolResponse.getSchoolList())
.filter(school -> school.getId().equals("168"))
.toList()
使用 FlatMap Operator schoolItem 查看您选择的项目
api.school().flatMap(new Func1<SchoolListResponse, Observable<SchoolItem>>() {
@Override
public Observable<SchoolItem> call(SchoolListResponse schoolListResponse) {
return Observable.from(schoolListResponse.getSchoolList());
}
}).filter(new Func1<SchoolItem, Boolean>() {
@Override
public Boolean call(SchoolItem schoolItem) {
return schoolItem.getId().equals("168");
}
}).subscribe(new Subscriber<SchoolItem>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(SchoolItem schoolItem ) {
//schoolItem Filtered Item
}
});