2016-06-23 2 views
2

В настоящее время я использую Retrofit2.0 для опроса сервера. Я получаю результат в x секунду, но проблема в том, что номер страницы не обновляется в API. Давайте переходим к коду для лучшего уточненияДооснащение Периодический вызов с разбивкой на страницы

private void startPolling() throws Exception { 
     Log.e("APP CONSTANT","" + current_page); 
     MrSaferWebService service = ServiceFactory.createRetrofitService(MrSaferWebService.class, AppConstants.BASE_URL); 
     final Observable<ReportResponse> reportResponseObservable = service.getListOfInciden("get_report", current_page, 5, incident_lat, incident_long); 
     Observable.interval(0,20,TimeUnit.SECONDS) 
       .flatMap(new Func1<Long, Observable<ReportResponse>>() { 
        @Override 
        public Observable<ReportResponse> call(Long aLong) { 
         return reportResponseObservable; 
        } 
       }) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Action1<ReportResponse>() { 
        @Override 
        public void call(ReportResponse response) { 
         Log.i("HEARTBEAT_INTERVAL", "Response from HEARTBEAT"); 
         ActivityUtils.showProgress(false, mRootView, mProgressView, mContext); 
         if (response.getStatus() == 1) { 
          current_page = current_page + 1; 
          if (!response.getReportList().isEmpty()) { 
           addItems(response.getReportList()); 
          } 
          else{ 
           //do nothing 
          } 

         } else { 
          Log.e("MY ERROR", "" + "SOME ERROR OCCURED"); 
         } 
        } 
       }, new Action1<Throwable>() { 
        @Override 
        public void call(Throwable throwable) { 
         ActivityUtils.showProgress(true, mRootView, mProgressView, mContext); 
         // TODO: 22/03/16 ADD ERROR HANDLING 
        } 
       }); 

    } 

Как вы можете видеть, я увеличившая current_page на 1 каждый раз, когда на преуспевающим ответ, но когда я проверить журнал на CURRENT_PAGE значение увеличивается только один раз и после этого журнала не существует и, следовательно, стоимость также не увеличивается. Поэтому каждый раз он получает один и тот же номер страницы и дает мне дубликат ответа.

Пожалуйста, помогите мне найти то, что мне не хватает.

+0

Где находится '' current_page''? Является ли это атрибутом объекта? Это работает, если вы добавите 'volatile''? - '' volatile int current_page; '' и вы уверены, что действие с ошибкой не вызвано? – Fred

+0

Он определен в уровне класса, как этот int current_page = 1 – Nirmal

ответ

1

Проведя больше, чем за день, я просто изменил действие с подписчиком, и все, кажется, работает. Я не знаю, что происходит внутри, но оно работает. Я все еще пытаюсь понять, какая разница между Action и Subscriber. Ниже приведен мой обновленный код, который сделал трюки.

private void startPolling() throws Exception { 
     final MrSaferWebService service = ServiceFactory.createRetrofitService(MrSaferWebService.class, AppConstants.BASE_URL); 
     Observable 
       .interval(0,20,TimeUnit.SECONDS) 
       .flatMap(new Func1<Long, Observable<ReportResponse>>() { 
        @Override 
        public Observable<ReportResponse> call(Long aLong) { 
         Log.e("PAGE", "" + current_page); 
         return service.getListOfInciden("get_report", current_page, 5, incident_lat, incident_long); 
        } 
       }) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<ReportResponse>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 
         e.printStackTrace(); 
         if (mProgressView !=null && mRootView !=null) { 
          ActivityUtils.showProgress(false, mRootView, mProgressView, mContext); 
         } 

        } 

        @Override 
        public void onNext(ReportResponse response) { 
         if (mProgressView !=null && mRootView !=null) { 
          ActivityUtils.showProgress(false, mRootView, mProgressView, mContext); 
         } 
         if (response.getStatus() == 1) { 
          if (!response.getReportList().isEmpty()){ 
           current_page = current_page + 1; 
           addItems(response.getReportList()); 
          } 
          else{ 
           //do nothing 
          } 

         } else { 
          Log.e("MY ERROR", "" + "SOME ERROR OCCURED"); 
         } 
        } 
       }); 

    } 
+0

Привет. Я пытаюсь реализовать аналогичную реализацию разбивки на страницы. И я застрял. Вы используете Observable с интервалом в 20 секунд, если я прав? Что, если я хочу, чтобы он запрашивал только тогда, когда это было сделано? Спасибо. Это мой вопрос. Http://stackoverflow.com/questions/38837499/retrofit2-tail-recursion-using-rxjava-rxandroid?noredirect1_comment65044509_38837499 –

+0

Вы пробовали функцию repeatWhen? – Nirmal

+0

Нет. Сожалею. Вы видели мою кодовую базу. Должен ли я использовать 'repeatWhen' там или использовать его так, как вы это делали? –

Смежные вопросы