android - 当与主题反跳时多次进行改造调用

标签 android retrofit rx-java

我点击了此链接 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 的创建转移到另一种方法中,例如 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);
 }

您的 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/

相关文章:

java - 接收 : How to get the last element even if onError was called?

android - 如何使用switchIfEmpty?

java - 如何在 onComplete 中使用 observable (Rxjava2)

键盘 View 中的 Android 布局

android - 带有 CollapsingToolbarLayout 的 CoordinatorLayout 与对话框 fragment 中的键盘中断

java - 改造。如果 (!response.isSucessful()) 得到响应

java - Retrofit 2 请求没有给我数据

google-app-engine - 在 Google App Engine 上通过 OKClient 使用 OkHttp 客户端会抛出 "java.lang.NoClassDefFoundError: java.net.ProxySelector"is a restricted class 错误

java - 构建 RecyclerView 时创建的自动生成文件出错

android - Retrofit2 向 Body 对象添加额外的字符串