与主题去抖动时,多次调用调用

时间:2016-05-03 14:10:10

标签: android retrofit rx-java

我按照 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()并使用相同的对象进行后端调用。但是,结果是一样的。请帮我解决一下这个问题。

1 个答案:

答案 0 :(得分:2)

在实际情况中,每次调用updateMarkers时都会添加订阅者。

为了实现您想要的效果,您必须使用其他方法移动Observable的创建,例如onResumeonCreate

//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")); 

}