RxJava获取GPS和融合位置

时间:2019-07-11 13:58:41

标签: android geolocation rx-java

我的应用程序中有两种方法来获取用户位置。两种方法均返回Observable。第一种方法通过位置管理器获取gps位置。第二种方法获得融合位置。


    @SuppressLint("MissingPermission")
    public Observable<Location> getRxGpsLocation(boolean single)
    {
        PublishSubject<Location> subject = PublishSubject.create();

        LocationManager locationManager = (LocationManager) activity.getSystemService(LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,
                5, new LocationListener()
                {
                    @Override
                    public void onLocationChanged(Location location)
                    {
                        subject.onNext(location);

                        if (single)
                        {
                            locationManager.removeUpdates(this);
                            subject.onComplete();
                        }
                    }

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras)
                    {

                    }

                    @Override
                    public void onProviderEnabled(String provider)
                    {

                    }

                    @Override
                    public void onProviderDisabled(String provider)
                    {
                        Log.e(TAG, "onProviderDisabled: Disableeedd");
                        if (single)
                        {
                            locationManager.removeUpdates(this);
                        }
                        subject.onError(new Throwable("Error nit found Location"));
                    }
                });

        return subject;
    }


    //I use this library to get Fused Location https://github.com/patloew/RxLocation
    @SuppressLint("MissingPermission")
    public Observable<Location> getRxFusedLocation()
    {
        RxLocation rxLocation = new RxLocation(AppClass.getApp());
        LocationRequest locationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setNumUpdates(1)
                .setInterval(1000);

        return rxLocation.location().updates(locationRequest);
    }

所以我的目标是提出以下请求链:

  1. 请求GPS定位
  2. 如果有Gps定位,则将其返回
  3. 如果在15秒内没有获得gps位置,则取消gps请求并启动融合的位置请求

在第一次请求后,如何将这两种方法结合在一起使用15秒定时器?

1 个答案:

答案 0 :(得分:0)

简而言之,请问您的问题。您必须从LocationManager创建一个流,并从FusedLocationProviderClient创建一个流 然后,您将执行“超时”操作。例如:

locationManagerObservable()
.timeout(15, TimeUnit.SECONDS)
 .onErrorResumeNext { error -> 
        if(error is TimeoutException)
            fusedLocationObservable()
        else
            Observable.error(error)
    }

出于您的目的使用主题不是一个好的选择。您应该研究如何从回调API创建Observable。

这是good article指南,指导您如何将位置提供程序源转换为Rxjava流 您可以在文章here

中查看源代码