gpt4 book ai didi

android - 使用 RxJava 和 Retrofit 的周期性 HTTP 请求

转载 作者:IT老高 更新时间:2023-10-28 22:17:38 26 4
gpt4 key购买 nike

是否可以使用 RxJava/RxAndroid 和 Retrofit 执行周期性的 http 请求以每 x 秒更新一次数据?

目前我正在使用每 x 秒触发一次的 IntentService 和递归处理程序/Runnable。我想知道我是否可以删除所有这些并让 RxJava 处理请求。

final RestClient client = new RestClient();
final ApiService service = client.getApiService();

public interface ApiService {
@GET("/athletes")
public Observable<List<Athlete>> getAthletes();
}

service.getAthletes()
.retry(3)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Athlete>>() {
@Override
public void call(List<Athlete> athletes) {
// Handle Success
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// Handle Error
}
});

编辑

完成后,我得到了以下代码。欢迎任何更新。

final Scheduler scheduler = Schedulers.from(Executors.newSingleThreadExecutor());

obs = Observable.interval(30, TimeUnit.SECONDS, scheduler)
.flatMap(tick -> service.getAthletes(1, 0l))
// Performed on service.getAthletes() observable
.subscribeOn(scheduler)
.observeOn(AndroidSchedulers.mainThread())
.doOnError(err -> Log.d("APP", "Error retrieving athletes: " + err.toString()))
.retry()
.flatMap(Observable::from)
.filter(athlete -> {
// Process Athlete here in the filter
// Return true to always send messages but could filter them out too
return true;
});

public static void startUpdates() {
if (sub != null) {
sub = obs.subscribe(athlete -> {
Log.d("APP", "Done updating athletes! ");
});
}
}

public static void stopUpdates() {
sub.unsubscribe();
sub = null;
}

最佳答案

使用 Observable.interval 并防止来自 service.getAthletes() 的重叠请求订阅 内的单线程 Scheduler平面 map :

Scheduler scheduler = Schedulers.from(Executors.newSingleThreadExecutor());
Observable.interval(x, TimeUnit.SECONDS)
.flatMap(n ->
service.getAthletes()
.retry(3)
.subscribeOn(scheduler))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Athlete>>() {
@Override
public void call(List<Athlete> athletes) {
// Handle Success
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// Handle Error
}
});

关于android - 使用 RxJava 和 Retrofit 的周期性 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768184/

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