gpt4 book ai didi

java - 如何将 Observable.fromIterable 中的项目索引传递给 subscribe 方法中的 onNext ?

转载 作者:行者123 更新时间:2023-12-01 18:30:43 34 4
gpt4 key购买 nike

我正在尝试使用 RxJava2 加载数据并将其放入 SparseArray 中。我通过从数组调用 URL 来获取数据,但我需要解析响应并将其按照数组中 URL 的顺序插入到 SparseArray 中,因此我需要传递 mUrls.getGroups() 中的 String 项的索引。

提前致谢!

@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,则只需在 Observer 中引入 index 字段即可:

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);
}

// ...
});

关于java - 如何将 Observable.fromIterable 中的项目索引传递给 subscribe 方法中的 onNext ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60171708/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com