我的应用程序中有两种方法来获取用户位置。两种方法均返回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);
}
所以我的目标是提出以下请求链:
在第一次请求后,如何将这两种方法结合在一起使用15秒定时器?
答案 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
中查看源代码