2016-11-12 4 views
1

Я пытаюсь получить google places и, согласно ограничению на api, вы не можете получить более 20 мест за запрос, а следующий запрос требует nextPageToken предыдущего запроса.Несколько последовательных наблюдений с своевременной задержкой между каждым из них

Проблема:

  • Zip оператор выполняет все запросы сразу, но мне нужно, чтобы они были последовательной и своевременная задержкой 4 seconds между каждым Observable вызова

  • Delay оператор позволяет ждать, но что это действительно так, что он немедленно выполняет вызовы Zip и возвращает мне результаты после заданного времени в задержке, что нежелательно.

Мой Источник:

LatLng some = new LatLng(31.471199, 74.234940); 
Observable 
     .zip(getNearByPlaces(some), getNearByPlaces(some), getNearByPlaces(some), new Func3<List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>>() { 
      @Override 
      public List<PlaceInfo> call(List<PlaceInfo> placeInfos, List<PlaceInfo> placeInfos2, List<PlaceInfo> placeInfos3) { 
       placeInfos2.addAll(placeInfos3); 
       placeInfos.addAll(placeInfos2); 
       return placeInfos; 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Observer<List<PlaceInfo>>() { 
      @Override 
      public void onCompleted() { 
      } 

      @Override 
      public void onError(Throwable e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onNext(List<PlaceInfo> placeInfos) { 
       adapter.setPlaces(placeInfos); 
      } 
     }); 

Я новичок и начал использовать rxjava около 1 неделю назад, так что вы можете ожидать ошибки.

+0

Hello ?????????? –

ответ

1

Давайте предположим, что вы следующая модель ответ

class Response { 
    private String pageToken; 
    private List<PlaceInfo> places; 

    //setters, getters etc 
} 

И у вас есть два метода для работы с API

Observable<Response> getNearByPlaces(LatLng latLng) {...} 
Observable<Response> getNextNearByPlaces(String pageToken) {...} 

Определить Transformer принести дополнительные места. Он ждет 4 секунды, затем выбирает следующие места и добавляет исходные места в ответ.

private Observable.Transformer<Response, Response> addNextPlaces() { 
    return observable -> observable 
      .delay(4, TimeUnit.SECONDS) 
      .flatMap(sourceResponse -> getNextNearByPlaces(sourceResponse.getPageToken()), 
        ((sourceResponse, nextResponse) -> { 
         nextResponse.getPlaces().addAll(sourceResponse.getPlaces()); 
         return responseNext; 
        })); 
} 

Тогда вы можете делать то, что вам нужно это путь

getNearByPlaces(latLng) 
     .compose(addNextPlaces()) 
     //add here additional compose methods if you need them 
     .subscribe(resultResponse -> { 
      resultResponse.getPlaces() //handle result List 
     }, error -> { 
      //handle error 
     }); 

P.S. Помните о потоках. delay выключатели Планировщик до computation

P.P.S. Я подозреваю, что существует более простое и изящное решение :)

+0

Спасибо, это сработало, только одна последняя проблема заключается в том, что его три процесса запроса, но над образцом обрабатывает запрос 2, я полагаю, –

+0

'.compose (addNextPlaces())' добавляет один дополнительный запрос, поэтому, если вы хотите связать больше запросов - просто скопируйте-вставьте эту строку и поместите ее ниже –

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