2016-12-07 55 views
0

我正在使用ReactiveLocation library。基本上,我想要在4秒內得到足夠準確的位置。如果當時沒有收到足夠精確的位置,但其他位置則返回最高準確位置。從RxJava鏈內設置變量

只要收到足夠精確的位置,就返回並完成可觀測。

我會發布我正在嘗試的代碼。我可能會,也可能是這樣做,錯誤的方式。

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); 
    }