Ich folgte diesem Link How to debounce a retrofit reactive request in java?, um eine nachträgliche reaktive Anfrage zu debuntieren. Unten ist mein Stück CodeNachrufanrufe, die bei Entprellen mit einem Betreff mehrfach ausgeführt werden
//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!!!");
}
});
});
}
Dies ist, was geschieht. Jedes Mal, wenn die updateMarkers() -Methode aufgerufen wird, erstellt Retrofit einen neuen call.clone() und die Anzahl der Aufrufe meines Backends wird jedes Mal um 1 erhöht. Ich habe auch versucht, APIHelper() global zu deklarieren und das gleiche Objekt zu verwenden, um meinen Back-End-Aufruf zu machen. Aber das Ergebnis ist das gleiche. Bitte helfen Sie mir mit einigen Tipps, um dieses Problem zu lösen.
Verschieben Sie das subject.debounce in einer anderen Methode, um einmal in Ihrer Anwendung zu abonnieren (und nicht jedes Mal, wenn Sie updateMakers aufrufen) – dwursteisen
Ich habe es auf onCreate() verschoben, so dass die Methode subject.debounce registriert ist. Gibt es einen besseren Ort, an den ich es verschieben kann? –
onResume? Übrigens, warum Ihr Retrofit-Anruf einen Anruf zurückgibt? Können Sie nicht direkt ein Observable zurückgeben? subject.debonce (1, SEKUNDEN) .flatMap (latLg -> api.getNearbyLocation (latLg.latitude, latLg.longitude)). subscribe(); – dwursteisen