Выполнение вызова API api через каждые x минут с использованием RxJava и Retrofit - PullRequest
0 голосов
/ 28 февраля 2019

В настоящее время я работаю над вызовом rest api и отображением данных в интерфейсе пользователя.Я использую 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);
                    }
                })
        ); 

Это работает нормально, и я могу получить данные и показать в пользовательском интерфейсе.Теперь, как часть усовершенствования, мне нужно периодически получать эти данные, даже если мое приложение находится в фоновом режиме или уничтожено.Я попробовал следующий код:

 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?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Вот рабочий образец Этот образец будет запрашивать каждые 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
0 голосов
/ 04 марта 2019

Ответом на ваш вопрос является использование 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
...