我点击了此链接 How to debounce a retrofit reactive request in java? 消除改造 react 请求。 下面是我的一段代码
//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() 并使用相同的对象进行后端调用。但是,结果是一样的。请帮我提供一些解决此问题的指示。
最佳答案
在实际情况中,每次调用 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);
}
您的 Activity :
//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"));
}
关于android - 当与主题反跳时多次进行改造调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37006580/