我按照 How to debounce a retrofit reactive request in java? 链接去除了一个改装反应请求。 下面是我的一段代码
//i declare the subject globally
PublishSubject<Call<List<Response>>> subject = PublishSubject.create();
//this is how i call retrofit
private void updateMarkers(LatLng center)
{
subject.onNext(new APIHelper().
GetNearByLocations("auth_key", center.latitude, center.longitude, urgency));
subject.debounce(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(call -> {
call.clone().enqueue(new Callback<List<Response>>()
{
@Override
public void onResponse(Call<List<Response>> call, Response<List<Response>> response)
{
Timber.d("BRAVO!!!");
}
@Override
public void onFailure(Call<List<Response>> call, Throwable t)
{
Timber.d("someone's gonna get hurt real bad!!!");
}
});
});
}
这就是发生的事情。每次调用updateMarkers()方法时,retrofit都会创建一个新的call.clone(),并且每次调用后端的次数都会增加1。我还尝试全局声明APIHelper()并使用相同的对象进行后端调用。但是,结果是一样的。请帮我解决一下这个问题。
答案 0 :(得分:2)
在实际情况中,每次调用updateMarkers
时都会添加订阅者。
为了实现您想要的效果,您必须使用其他方法移动Observable的创建,例如onResume
或onCreate
:
//i declare the subject globally
PublishSubject<Call<List<Response>>> subject = PublishSubject.create();
private void updateMarkers(LatLng center)
{
subject.onNext(new APIHelper().
GetNearByLocations("auth_key", center.latitude, center.longitude, urgency));
}
@Override
public void onResume(Context ctx) {
subject.debounce(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(call -> {
call.clone().enqueue(new Callback<List<Response>>()
{
@Override
public void onResponse(Call<List<Response>> call, Response<List<Response>> response)
{
Timber.d("BRAVO!!!");
}
@Override
public void onFailure(Call<List<Response>> call, Throwable t)
{
Timber.d("someone's gonna get hurt real bad!!!");
}
});
});
}
请注意,您可以将Retrofit 2与RxJava一起使用:
您的API:
public interface MyApi {
Observable<String> getNearByLocation(Double latitude, Double longitude);
}
您的活动:
//i declare the subject globally
PublishSubject<LatLng> subject = PublishSubject.create();
private void updateMarkers(LatLng center)
{
subject.onNext(center);
}
public void onCreate(Context ctx) {
subject.debounce(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.flatMap(latLng -> api.getNearByLocation(latLng.latitude, latLng.longitude))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(r -> Timber.d("BRAVO !"), e -> Timber.d("Problems"));
}