2016-12-07 2 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); 
    } 
関連する問題