【问题标题】:Making a Rest api call at every x minutes using RxJava and Retrofit使用 RxJava 和 Retrofit 每隔 x 分钟调用一次 Rest api
【发布时间】:2019-07-22 11:36:02
【问题描述】:

我目前正在调用 rest api 并在 UI 上显示数据。我正在使用 rxAndroid 和 Retrofit。以下是代码:

disposable.add(apiService.getIncidents(1, "true")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Function<IncidentResponse, List<Incident>>() {
                    @Override
                    public List<Incident> apply(
                            @io.reactivex.annotations.NonNull final IncidentResponse incidentResponse)
                            throws Exception {
                        return incidentResponse.getIncidents();
                    }
                })
                .subscribe(new Consumer<List<Incident>>() {
                    @Override
                    public void accept(
                            @io.reactivex.annotations.NonNull final List<Incident> incidents)
                            throws Exception {
                        recyclerView.setAdapter(mIncidentAdapter);
                        displayIncidents(incidents);
                    }
                })
        ); 

这工作正常,我能够获取数据并在 UI 上显示。现在作为增强功能的一部分,即使我的应用程序处于后台或被终止,我也需要定期获取这些数据。我尝试了以下代码:

 disposable.add(((apiService.getIncidents(1, "true")).interval(10,TimeUnit.SECONDS))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Function<IncidentResponse, List<Incident>>() {
                    @Override
                    public List<Incident> apply(
                            @io.reactivex.annotations.NonNull final IncidentResponse incidentResponse)
                            throws Exception {
                        return incidentResponse.getIncidents();
                    }
                })
                .subscribe(new Consumer<List<Incident>>() {
                    @Override
                    public void accept(
                            @io.reactivex.annotations.NonNull final List<Incident> incidents)
                            throws Exception {
                        recyclerView.setAdapter(mIncidentAdapter);
                        displayIncidents(incidents);
                    }
                })
        );

但是我在方法映射中遇到编译错误,“在 Observable 中无法应用”。这是正确的方法还是不能使用 RxAndroid 完成?

【问题讨论】:

  • 你需要像Observable.interval(10,TimeUnit.SECONDS).flatMap(i -&gt; apiService.getIncidents(1, "true")) 这样称呼它——应该可以。如果您不需要旧请求(如果请求超过 10 秒),您可以使用 switchMap() 而不是 flatMap()

标签: java android retrofit rx-java rx-android


【解决方案1】:

您的问题的答案是使用 JobScheduler 或使用工作管理器以特定时间间隔运行您的任务。

我个人建议您使用工作管理器,因为即使应用程序在后台,您也可以安排您的任务定期运行。

MyWorker.kt

class MyWorker(val ctx: Context, val params: WorkerParameters) 
: Worker(ctx, params) {

      override fun doWork(): Result {
         //Here you can run place your api call
        return Result.success()
    }

Activity.kt

 val workManager = WorkManager.getInstance()
        val myWork = PeriodicWorkRequest.Builder(MyWorker::class.java, 15, TimeUnit.MINUTES)
                .addTag(TAG)
                .setConstraints(constraints)
                .build()
        workManager.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, myWork)//starts work Manager

【讨论】:

    【解决方案2】:

    这是一个工作示例 此示例将每 5 秒请求一次。根据需要进行更改

            Observable.interval(1, 5, TimeUnit.SECONDS)
                    .flatMap(new Function<Long, ObservableSource<List<ActivityGroup>>>() {
                        @Override
                        public ObservableSource<List<ActivityGroup>> apply(Long aLong) throws Exception {
                            return ServiceGenerator.createService(ActivityGroupAPI.class).getActivityGroup().subscribeOn(Schedulers.io());
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new DisposableObserver<List<ActivityGroup>>() {
                        @Override
                        public void onNext(List<ActivityGroup> activityGroups) {
                            Calendar cal = Calendar.getInstance();
                            Timber.i("%s: %s", cal.getTime().toString(), activityGroups.size());
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            e.printStackTrace();
                        }
    
                        @Override
                        public void onComplete() {
    
                        }
                    });
    

    Logcat

    SettingsActivity: Wed Mar 27 16:42:25 GMT+05:45 2019: 2
    SettingsActivity: Wed Mar 27 16:42:29 GMT+05:45 2019: 2
    SettingsActivity: Wed Mar 27 16:42:34 GMT+05:45 2019: 2
    SettingsActivity: Wed Mar 27 16:42:39 GMT+05:45 2019: 2
    SettingsActivity: Wed Mar 27 16:42:44 GMT+05:45 2019: 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 2018-06-29
      • 2017-07-23
      • 2011-06-23
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多