2016-12-07 2 views
0

Я использую ReactiveLocation library. В принципе, я хочу получить место в течение 4 секунд с достаточной точностью. Если в это время не было получено достаточной точности, но в других местах затем вернется место с наивысшей точностью.Настройка переменной изнутри RxJava Chain

Как только будет получено место с достаточной точностью, оно возвращается и наблюдаемое завершено.

Я отправлю код того, что я пытаюсь. Я мог бы быть, и, вероятно, я ошибаюсь.

LocationRequest request = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setFastestInterval(FASTEST_UPDATE_INTERVAL) 
      .setSmallestDisplacement(MIN_DISTANCE_UPDATE_INTERVAL); 

    if (expirationSeconds != null) 
     request.setExpirationDuration(TimeUnit.SECONDS.toMillis(expirationSeconds)); 

    ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context); 
    Observable<Location> observable = locationProvider.getUpdatedLocation(request) 
       .doOnNext(new Action1<Location>() { 
        @Override 
        public void call(Location location) { 
         if (mostAccurateLocation == null) 
          mostAccurateLocation = location; 

         if (location.getAccuracy() < mostAccurateLocation.getAccuracy()) 
          mostAccurateLocation = location; 
        } 
       }) 
       .filter(new Func1<Location, Boolean>() { 
        @Override 
        public Boolean call(Location location) { 
         return location.getAccuracy() < sufficientAccuracy ; 
        } 
       }); 

    if (expirationSeconds != null) 
     observable = observable.timeout(expirationSeconds, TimeUnit.SECONDS, Observable.just(mostAccurateLocation), backgroundThread); 

    return observable.firstOrDefault(mostAccurateLocation) 
        .doOnNext(new Action1<Location>() { 
         @Override 
         public void call(Location location) { 
          lastLocation = location; 
         } 
        }); 

ответ

0

Хорошо, я нашел проблему. Таймаут начинался, но, очевидно, наблюдаемое начало таймаутом использовало переменную mostAccurateLocation, как это было во время наблюдаемого создания.

Чтобы исправить это, я использовал шаблон Observable.defer, чтобы он создавал только Observable<Location>, когда он был подписан.

if (expirationSeconds != null) { 
     Observable<Location> mostAccurateLocationObservable = Observable.defer(new Func0<Observable<Location>>() { 
      @Override 
      public Observable<Location> call() { 
       return Observable.just(mostAccurateLocation); 
      } 
     }); 

     observable = observable.timeout(expirationSeconds, TimeUnit.SECONDS, mostAccurateLocationObservable, backgroundThread); 
    } 
Смежные вопросы