Непрерывный вызов API, даже когда приложение Android закрыто — RxJava

#android #retrofit #rx-java #rx-android

#Android #модернизация #rx-java #rx-android

Вопрос:

Я разработал приложение для Android, в котором мне нужно получить список с помощью вызова rest API и отобразить в моем приложении. Список часто обновляется. Я написал следующий код, используя RxAndroid и retrofit для выполнения вызова api :

 private void fetchAllData() {
        disposable.add(Observable.interval(0,60,TimeUnit.SECONDS).
                subscribeOn(Schedulers.io()).
                flatMap(i -> apiService.getData(fetchActiveData)).
                observeOn(AndroidSchedulers.mainThread()).
                subscribeWith(new DisposableObserver<DataResponse>() {
                   @Override
                   public void onNext(DataResponse dataResponse) {
                       Log.i(TAG, "The rest api was called again");
                       List<Data> dataList = dataResponse.getData();
                       displayData(dataList,false);
                   }
                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "The exception is thrown :: "   e.getMessage());
                        displayData(null,true);
                        fetchAllData();
                    }
                    @Override
                    public void onComplete() {

                    }
                })
        );
    }
  

Используя приведенный выше код, я могу вызывать api каждые 60 секунд и обновлять свой список. Если есть какой-либо новый элемент, который я не отображаю в приложении, то для этого у меня есть логика для отображения уведомления.

Чтобы улучшить мое приложение, мне нужно выполнить вызов api, когда приложение закрыто и не работает в фоновом режиме. Может кто-нибудь, пожалуйста, подсказать мне, как мне достичь этого с помощью RxJava.

Комментарии:

1. Вы не можете этого сделать, если процесс не запущен, когда приложение убито. Попробуйте использовать JobShedular . Но каждые 60 секунд вы просто не можете делать это в фоновом режиме, если не используете службу переднего плана.

2. Если вы не хотите, чтобы служба вызывалась в фоновом режиме, вы можете избавиться от объекта по завершении работы вашего приложения.

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

4. Мое требование заключается в том, что даже если приложение не находится на переднем плане, если в наборе данных есть какие-либо изменения, пользователь должен быть уведомлен. Предположим, что если мы остановим какое-либо приложение для обмена сообщениями, то при появлении нового сообщения мы получим уведомление.