Rx和Retrofit:更改由repeatwhen或repeatuntill启动的请求循环中的ServiceApi请求参数

Ami*_*mit 3 android rx-java retrofit2

我正在为我的应用程序使用 Retrofit 和 RxJava。我正在执行一个请求,该请求每 1 秒就会到达服务器一次。为此,我使用请求参数创建改造服务 API,并订阅返回的可观察值并使用 RepeatWhen。

问题是,每次请求被命中时,我想更改随请求发送的请求参数(基本上必须使其动态)。我怎样才能实现这个目标?

例如用例:sendLocation Api 每 10 秒向服务器发送当前位置。如何使用改造和 RxJava 来实现这一点

iag*_*een 5

如果添加延迟,@TassosBassoukos 的答案就有效。具体来说,这里是一个使用 github API 的完整示例,该示例在两个用户之间交替调用。确保不要让它运行太久——

public interface GitHubService {
    @GET("/users/{user}/repos")
    Observable<String> getRepo(@Path("user") String user);
}

static String[] users = {"octocat", "square"};
static int i = 0;

static String getUser() {
    return users[i++ % 2];
 }

public void RxGitRepo() {
    OkHttpClient client = new OkHttpClient();

    Retrofit retrofit = new Retrofit.Builder()
      .client(client)
      .baseUrl("https://api.github.com")
      .addConverterFactory(ScalarsConverterFactory.create())
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
      .build();

   GitHubService gitHubService = retrofit.create(GitHubService.class);
   Observable
      .defer(() -> Observable.just(getUser()))
      .flatMap(user -> gitHubService.getRepo(user))
      .repeatWhen(done -> done.delay(2, TimeUnit.SECONDS))
      .subscribeOn(Schedulers.io())
      .subscribe(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)

对于您的用例,您可以在该位置上设置可观察对象并使用它来触发更新,而不是每 10 秒轮询一次位置。使用像android-reactiveLocation这样的库,您可以获得一个Observable流位置。类似于以下未经测试的代码的内容——

LocationRequest request = LocationRequest.create() 
                             .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                             .setInterval(10000);

ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context);
Subscription subscription = locationProvider.getUpdatedLocation(request)
    .sample(10, TimeUnits.SECONDS)
    .flatMap(/* your retrofit call based on the observed location */)  
    .subscribe(/* subsciber for retrofit call results */);
Run Code Online (Sandbox Code Playgroud)