首页 文章

将响应返回为Flowable时,不会调用onComplete

提问于
浏览
1

我正在尝试使用retrofit和rxjava 2进行webservie调用 . 我正在探索两种不同的方法来使用RxJava2 . 问题是我得到回应,我使用 Observable 但它不适用于 Flowable . 使用 Flowable 时我没有打印日志我尝试调试它但它不会进入 onNextonCompleteonError . 只有 onSubscribe 被执行 .

1)使用observable作为返回类型

new WebRequestManager().getContactObservable(userRequest)   
    .subscribe(new Observer<ResponseData>() {
                   @Override
                   public void onSubscribe(Disposable d) {

                   }

                   @Override
                   public void onNext(ResponseData responseData) {

                       Log.e(TAG , "data "+responseData.getStatus());
                   }

                   @Override
                   public void onError(Throwable e) {

                   }

                   @Override
                   public void onComplete() {

                       Log.e(TAG , "data complete");

                   }
               }
    );

2)使用flowable作为返回类型

new WebRequestManager().getContactFlowable(userRequest)

 .subscribe(new Subscriber<ResponseData>() {
     @Override
     public void onSubscribe(Subscription s) {

         Log.e(TAG , "contact subscription ");

     }

     @Override
     public void onNext(ResponseData responses) {

         Log.e(TAG , "contact onNext ");


     }

     @Override
     public void onError(Throwable t) {

     }

     @Override
     public void onComplete() {

         Log.e(TAG , "contact onComplete ");
     }
 });

休息联系改造api

public interface ContactApi {

    @POST(WebRequest.GET_CONTACTS)
    Flowable<ResponseData> getContactFlowable(@Body UserRequest userRequest);

    @POST(WebRequest.GET_CONTACTS)
    Observable<ResponseData> getContactObservable(@Body UserRequest userRequest);

}

打电话给webservice

public Flowable<ResponseData> getContactsData(UserRequest userRequest){
        return webRequest.getWebClient().create(ContactApi.class).getContacts(userRequest);


    }

    public Observable<ResponseData> getContact(UserRequest userRequest){
        return webRequest.getWebClient().create(ContactApi.class).getContact(userRequest);

    }

获得改造实例

public static Retrofit getWebClient(){

        //if(okHttpClient == null)
            okHttpClient = new OkHttpClient.Builder()
                                    .connectTimeout(120,TimeUnit.SECONDS)
                                    .readTimeout(120,TimeUnit.SECONDS)
                                    .writeTimeout(120,TimeUnit.SECONDS)

                                    .addInterceptor(new WebRequestInterceptor("\"application/json\""))
                                    .build();


      // if(client == null)
        client = new  Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(okHttpClient)
                .addConverterFactory(LoganSquareConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        return client;
    }

1 回答

  • 2

    使用 Subscriber s,您必须调用 request 来获取项目:

    new WebRequestManager().getContactFlowable(userRequest)
        .subscribe(new Subscriber<ResponseData>() {
            @Override
            public void onSubscribe(Subscription s) {
                Log.e(TAG , "contact subscription ");
                s.request(Long.MAX_VALUE); // <---------------------------------
            }
    
            @Override
            public void onNext(ResponseData responses) {
                Log.e(TAG , "contact onNext ");
            }
    
            @Override
            public void onError(Throwable t) {
    
            }
    
            @Override
            public void onComplete() {
                Log.e(TAG , "contact onComplete ");
            }
       });
    

    另见DisposableSubscriber及其示例 .

相关问题