使用 RxAndroid 生成树排序结构
Generating tree sort of structure using RxAndroid
我正在尝试我的手和 RxAndroid。我让我的同步适配器查询服务 A 以获取列表页面(大小 n)。对于 Pages 中的每个项目,我都必须发出生成另一个 Lines(大小 m)的请求。也就是说,对于 Pages 中的每个项目,将有 m Lines.I 想要将所有 n 行组合成 1 个大小为 m*n 的列表并保存到数据库中。
Observable.create(new Observable.OnSubscribe<Page>(){
@Override
public void call(Subscriber<? super Page> subscriber) {
ArrayList<Page> pages = Utility.getPagesFromServer();
for (Page page : pages) {
subscriber.onNext(page);
}
subscriber.onCompleted();
}
}).map(new Func1<Page, JSONResponse>() {
@Override
public JSONResponse call(Page page) {
return Utility.getJSONObjectContainingLines(page);
}
}).map(new Func1<JSONResponse, ArrayList<Line>>() {
@Override
public ArrayList<Line> call(JSONResponse jsonResponse) {
return getLines(jsonResponse.getJSONObject());
}
})
我从服务器获取页面,然后从服务器映射并获取每个页面的行,然后解析 JSON 并获取行的数组列表。我不确定如何从这里开始。至于现在我想迭代每一行而不是每个 ArrayList 。
在最后 map( )
使用 .flatMapIterable( )
之后,您会将 Observable<ArrayList<Line>>
转换为 Observable<Line>
并在 onNext(Line l)
中迭代它(或使用 forEach( )
):
Observable.defer(new Func0<Observable<Page>>() {
@Override
public Observable<Page> call() {
return Observable.from(Utility.getPagesFromServer());
}
})
.map(new Func1<Page, JSONResponse>() {
@Override
public JSONResponse call(Page page) {
return Utility.getJSONObjectContainingLines(page);
}
})
.map(new Func1<JSONResponse, ArrayList<Line>>() {
@Override
public ArrayList<Line> call(JSONResponse jsonResponse) {
return getLines(jsonResponse.getJSONObject());
}
})
.flatMapIterable(new Func1<ArrayList<Line>, Iterable<Line>>() {
@Override
public Iterable<Line> call(ArrayList<Line> lines) {
return lines;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Line>() {
@Override
public void call(Line line) {
//Do something with your line
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
}, new Action0() {
@Override
public void call() {
//on complete
}
});
或使用Lambdas
:
Observable.defer(() -> Observable.from(Utility.getPagesFromServer()))
.map(page -> Utility.getJSONObjectContainingLines(page))
.map(jsonResponse -> getLines(jsonResponse.getJSONObject()))
.flatMapIterable(lines -> lines)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(line -> {
//Do something with your line
}, throwable -> throwable.printStackTrace(), () -> {
//on complete
});
更新:
我决定添加一些链接:
Transforming-Observables
flatmap
如您所见,将 Observable<ArrayList<Line>>
转换为 Observable<Line>
您应该使用运算符 flatMapIterable()
我正在尝试我的手和 RxAndroid。我让我的同步适配器查询服务 A 以获取列表页面(大小 n)。对于 Pages 中的每个项目,我都必须发出生成另一个 Lines(大小 m)的请求。也就是说,对于 Pages 中的每个项目,将有 m Lines.I 想要将所有 n 行组合成 1 个大小为 m*n 的列表并保存到数据库中。
Observable.create(new Observable.OnSubscribe<Page>(){
@Override
public void call(Subscriber<? super Page> subscriber) {
ArrayList<Page> pages = Utility.getPagesFromServer();
for (Page page : pages) {
subscriber.onNext(page);
}
subscriber.onCompleted();
}
}).map(new Func1<Page, JSONResponse>() {
@Override
public JSONResponse call(Page page) {
return Utility.getJSONObjectContainingLines(page);
}
}).map(new Func1<JSONResponse, ArrayList<Line>>() {
@Override
public ArrayList<Line> call(JSONResponse jsonResponse) {
return getLines(jsonResponse.getJSONObject());
}
})
我从服务器获取页面,然后从服务器映射并获取每个页面的行,然后解析 JSON 并获取行的数组列表。我不确定如何从这里开始。至于现在我想迭代每一行而不是每个 ArrayList 。
在最后 map( )
使用 .flatMapIterable( )
之后,您会将 Observable<ArrayList<Line>>
转换为 Observable<Line>
并在 onNext(Line l)
中迭代它(或使用 forEach( )
):
Observable.defer(new Func0<Observable<Page>>() {
@Override
public Observable<Page> call() {
return Observable.from(Utility.getPagesFromServer());
}
})
.map(new Func1<Page, JSONResponse>() {
@Override
public JSONResponse call(Page page) {
return Utility.getJSONObjectContainingLines(page);
}
})
.map(new Func1<JSONResponse, ArrayList<Line>>() {
@Override
public ArrayList<Line> call(JSONResponse jsonResponse) {
return getLines(jsonResponse.getJSONObject());
}
})
.flatMapIterable(new Func1<ArrayList<Line>, Iterable<Line>>() {
@Override
public Iterable<Line> call(ArrayList<Line> lines) {
return lines;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Line>() {
@Override
public void call(Line line) {
//Do something with your line
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
}, new Action0() {
@Override
public void call() {
//on complete
}
});
或使用Lambdas
:
Observable.defer(() -> Observable.from(Utility.getPagesFromServer()))
.map(page -> Utility.getJSONObjectContainingLines(page))
.map(jsonResponse -> getLines(jsonResponse.getJSONObject()))
.flatMapIterable(lines -> lines)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(line -> {
//Do something with your line
}, throwable -> throwable.printStackTrace(), () -> {
//on complete
});
更新:
我决定添加一些链接:
Transforming-Observables
flatmap
如您所见,将 Observable<ArrayList<Line>>
转换为 Observable<Line>
您应该使用运算符 flatMapIterable()