Android 使用RxJava和改型的定期HTTP请求

Android 使用RxJava和改型的定期HTTP请求,android,retrofit,rx-java,rx-android,Android,Retrofit,Rx Java,Rx Android,是否可以使用RxJava/RxAndroid和改型来执行定期http请求,以每x秒更新一次数据 目前,我使用的是IntentService和递归处理程序/Runnable,每x秒触发一次。我想知道我是否可以删除所有这些,让RxJava处理请求 final RestClient client = new RestClient(); final ApiService service = client.getApiService(); public interface ApiService {

是否可以使用RxJava/RxAndroid和改型来执行定期http请求,以每x秒更新一次数据

目前,我使用的是IntentService和递归处理程序/Runnable,每x秒触发一次。我想知道我是否可以删除所有这些,让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
    }
});

使用
Observable.interval
并防止来自
service.getAthlets()
的重叠请求在
flatMap
中的单线程
调度程序上订阅:

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
        }
    });
Scheduler Scheduler=Schedulers.from(Executors.newSingleThreadExecutor());
可观测时间间隔(x,时间单位,秒)
.flatMap(n->
服务
.重试(3)
.subscribeOn(调度程序))
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@凌驾
公众无效呼叫(运动员名单){
//成功
}
},新行动1(){
@凌驾
公共无效呼叫(可丢弃可丢弃){
//处理错误
}
});

您能解释一下flatMap在这里做什么吗?我用的是Java 7,所以lambda不在了。实现Func1时,我注意到它返回了一个可观察的。subscribe()返回订阅。因此,只要返回可观察的,它应该是好的?这就是如何将可观察的“展平”为可观察的,所以是的,Func1应该有签名Func1。顺便说一句,我希望您的API返回Observable,而不是Observable,以获得更大的灵活性(在这种情况下,您可以通过添加.toList来获得Observable)。该服务并不完美,因此反序列化程序只删除运动员列表并返回该列表。除此之外,我注意到这个方法将进行另一次调用,即使之前的方法没有响应。有没有一种方法可以设置它,使它只在前一个的响应之后进行后续调用?可以使用.delay(x,TimeUnit.SECONDS)和.repeat()?类似于source.doOnNext(processCatalers).doOnError(logError()).delay(x,TimeUnit.SECONDS)。repeat().subscribe()。不一定。我已经使用单线程调度程序进行了更新。看看你怎么想。
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
        }
    });