Java RxAndroid取消谷歌地图对相机的影响
我有一个应用程序,它正在使用谷歌地图和监听摄像头的变化。我的问题是,每次更换相机时,我都必须请求后端。我想做的只是通过使用RxAndroid/Java来限制请求的数量 我的代码如下所示:Java RxAndroid取消谷歌地图对相机的影响,java,android,google-maps,rx-android,Java,Android,Google Maps,Rx Android,我有一个应用程序,它正在使用谷歌地图和监听摄像头的变化。我的问题是,每次更换相机时,我都必须请求后端。我想做的只是通过使用RxAndroid/Java来限制请求的数量 我的代码如下所示: Observable.create(new Observable.OnSubscribe<CameraPosition>() { @Override public void call(Subscriber<? super CameraPosition> s
Observable.create(new Observable.OnSubscribe<CameraPosition>() {
@Override
public void call(Subscriber<? super CameraPosition> subscriber) {
if (!subscriber.isUnsubscribed()) {
map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
subscriber.onNext(cameraPosition);
}
});
}
}
}).subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.onErrorResumeNext(Observable.<CameraPosition>empty())
.debounce(1, TimeUnit.SECONDS)
.subscribe(cameraPosition -> {
final LatLngBounds item = map.getProjection().getVisibleRegion().latLngBounds;
homeActionBarActivity.getNMB().getRide().list(
item.southwest.latitude,
item.southwest.longitude,
item.northeast.latitude,
item.northeast.longitude)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.onErrorResumeNext(Observable.<List<Ride>>empty())
.subscribe(new Action1<List<Ride>>() {
@Override
public void call(List<Ride> rides) {
clearRidePointsFromMap();
for (Ride ride : rides) {
if (isAdded())
addRideStartPointToMap(ride);
}
}
});
});
你知道吗
注意:如果我从Observable.create(…)中取出map.setOnCamerachenglisterner(…),它工作正常。好的,这似乎(可能)是由于RxJava内部关于如何管理将对象从订阅者传递给观察者的问题。我通过简单地将LatLngBounds放在订阅者内部而不是观察者内部来解决问题
Observable.create(new Observable.OnSubscribe<LatLngBounds>() {
@Override
public void call(Subscriber<? super LatLngBounds> subscriber) {
if (!subscriber.isUnsubscribed()) {
map.setOnCameraChangeListener(cameraPosition ->
subscriber.onNext(map.getProjection().getVisibleRegion().latLngBounds));
}
}
}).subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.onErrorResumeNext(Observable.<LatLngBounds>empty())
.debounce(1, TimeUnit.SECONDS)
.subscribe(item -> {
homeActionBarActivity.getNMB().getRide().list(
item.southwest.latitude,
item.southwest.longitude,
item.northeast.latitude,
item.northeast.longitude)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.onErrorResumeNext(Observable.<List<Ride>>empty())
.subscribe(new Action1<List<Ride>>() {
@Override
public void call(List<Ride> rides) {
clearRidePointsFromMap();
for (Ride ride : rides) {
if (isAdded())
addRideStartPointToMap(ride);
}
}
});
});
Observable.create(新建Observable.OnSubscribe()){
@凌驾
public void call(subscriber)也有同样的问题,这种方法解决了它。你有没有机会弄明白为什么这不起作用?这让我不确定在订阅者中做一般的UI工作是否像我想的那样安全。
Observable.create(new Observable.OnSubscribe<LatLngBounds>() {
@Override
public void call(Subscriber<? super LatLngBounds> subscriber) {
if (!subscriber.isUnsubscribed()) {
map.setOnCameraChangeListener(cameraPosition ->
subscriber.onNext(map.getProjection().getVisibleRegion().latLngBounds));
}
}
}).subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.onErrorResumeNext(Observable.<LatLngBounds>empty())
.debounce(1, TimeUnit.SECONDS)
.subscribe(item -> {
homeActionBarActivity.getNMB().getRide().list(
item.southwest.latitude,
item.southwest.longitude,
item.northeast.latitude,
item.northeast.longitude)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.onErrorResumeNext(Observable.<List<Ride>>empty())
.subscribe(new Action1<List<Ride>>() {
@Override
public void call(List<Ride> rides) {
clearRidePointsFromMap();
for (Ride ride : rides) {
if (isAdded())
addRideStartPointToMap(ride);
}
}
});
});