我正在尝试使用RxJava2加载数据并将其放入SparseArray。我是通过从数组调用URL来获取数据的,但是我需要解析响应并将其按照数组中URL的顺序插入到SparseArray中,因此我需要在mUrls.getGroups()
提前感谢!
@GET
Single<ResponseBody> getChannels(@Url String url);
groups = new SparseArray<>();
Observable.fromIterable(mUrls.getGroups())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//
// How can I access the index of the String item in the array?
//
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
Group group = GroupParser.parseList(responseBody.byteStream(), index);
groups.put(index, group);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, e.getMessage());
}
@Override
public void onComplete() {
}
});
编辑:
这是已实现的解决方案:
Observable.defer(() -> {
AtomicInteger counter = new AtomicInteger();
return Observable.fromIterable(mUrls.getGroups())
.map(url -> new Pair(url, counter.getAndIncrement()));
}).flatMapSingle(pair ->
aPI.getChannels(pair.first.toString())
.map(responseBody -> new Pair(responseBody, pair.second))
.subscribeOn(Schedulers.io())
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Pair>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Pair pair) {
Pair<ResponseBody, Integer> resultPair = (Pair<ResponseBody, Integer>) pair;
Group group = GroupParser.parseList(resultPair.first.byteStream(),
resultPair.second);
groups.put(resultPair.second, group);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "***** message: " + e.getMessage());
}
@Override
public void onComplete() {
Log.i(TAG, "***** onComplete.");
}
});
如果您按顺序处理URL,则只需在index
中引入Observer
字段:
Observable.fromIterable(mUrls.getGroups())
.concatMapSingle(url -> getChannels(url))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
int index; // <----------------------------------------------------
// ...
@Override
public void onNext(ResponseBody responseBody) {
Group group = GroupParser.parseList(responseBody.byteStream(), index);
groups.put(index, group);
index++; // <---------------------------------------------------------
}
// ...
});
但是,如果同时处理这些URL,则必须将每个URL与一个索引配对并一起对其进行标记。例如,给定一个Pair
类:
Observable.defer(() -> {
AtomicInteger counter = new AtomicInteger();
return Observable.fromIterable(mUrls.getGroups())
.map(url -> Pair.of(url, counter.getAndIncremenet()));
})
.flatMapSingle(urlIndex ->
getChannels(urlIndex.first)
.map(v -> Pair.of(v, urlIndex.second))
.subscribeOn(Schedulers.io())
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Pair<ResponseBody, Integer>>() {
// ...
@Override
public void onNext(Pair<ResponseBody, Integer> pair) {
Group group = GroupParser.parseList(pair.first.byteStream(), pair.second);
groups.put(pair.second, group);
}
// ...
});