gpt4 book ai didi

java - Android、java rx、异步

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:54 25 4
gpt4 key购买 nike

我有一个显示项目列表的屏幕。

  • 首先我想显示本地数据库中的元素。
  • 用户查看本地元素后,检查互联网并更新它们(如果设备有互联网)。

我有以下代码 fragment

Observable<Data> fetchFromdisk = ...;  
Observable<Data> fetchFromNetwork = ...;

Observable<Data> fetchData= Observable.concat (fetchFromdisk ,fetchFromNetwork);

然后我正在执行以下操作

mSubscriptions.clear();
Subscription subscription = fetchData
.subscribeOn(mSchedulerProvider.computation())
.observeOn(mSchedulerProvider.ui())
.subscribe(
new Subscriber<List<Data>>() {
@Override
public void onCompleted() {
view.setLoadingIndicator(false);
}

@Override
public void onError(Throwable e) {
processError(e);
}

@Override
public void onNext(List<Data> data) {
processData(data);
}
}

);
mSubscriptions.add(subscription);

但是发生的情况是首先运行 fetchFromdisk,然后执行 FetchFromNetwork。一旦发射元素结束,ProcessData 的执行就开始。

这与我想要实现的目标完全相反。我想优先考虑用户快速查看数据,然后访问互联网。我做错了什么?

最佳答案

一旦缓存被提取,您可以调用方法.doOnCompleted来执行您的代码。

mSubscriptions.clear();
Subscription subscription = fetchData
.subscribeOn(mSchedulerProvider.computation())
.doOnCompleted( new Action0<List<Notification>>() {
@Override
public void call(List<Data> cachedData) {
// Get data from server here.

// Compare new data against cached data.

// Update cache.

// Process new data.
}
})
.observeOn(mSchedulerProvider.ui())
.subscribe(
new Subscriber<List<Data>>() {
@Override
public void onCompleted() {
view.setLoadingIndicator(false);
}

@Override
public void onError(Throwable e) {
processError(e);
}

@Override
public void onNext(List<Data> data) {
processData(data);
}
}

);
mSubscriptions.add(subscription);

/////////非解决方案提示///////

尝试使用 Single 而不是 Observable,它可以摆脱 onCompleted。 https://github.com/lettuce-io/lettuce-core/issues/139

关于java - Android、java rx、异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43081474/

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