我正在使用rxJava并对我的请求进行改造,但是当我发出请求时,我的应用程序会冻结,直到请求完成 .

这是我在片段中启动请求的方式

MappingService.postSearch()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<SearchResponse>() {
                        @Override
                        public void accept(SearchResponse response) throws Exception {
                            searchResponse = response;
                            }
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(@NonNull Throwable throwable) throws Exception {
                            throwable.printStackTrace();
                        }
                    }));

我读了一些stackoverflow问题,如果我理解它,那么subscribeOn将在Schedulers.io()中启动postSearch()方法,并且使用observeOn,订阅部分将在我的mainThread上执行 .

postSearch方法启动此方法:

public class RequestService<T> {

   public Single<T> launchRequest(final Single single) {
    return single.subscribeOn(Schedulers.io()).onErrorResumeNext(
            new Function<Throwable, SingleSource<? extends Response<T>>>() {
                @Override
                public SingleSource<? extends Response<T>> apply(@NonNull Throwable throwable) throws Exception {
                    return Single.error(ErrorUtils.asRetrofitException(throwable));
                }
            }).flatMap(new Function<Response<T>, Single<T>>() {
        @Override
        public Single<T> apply(@NonNull Response<T> response) throws Exception {
            if (response.code() == Integer.valueOf(ErrorUtils.CODE_200)) {
                return Single.just(response.body());
            } else {
                return Single.error(new Throwable(String.valueOf(response.code())));
            }
        }
    });
}

}

如果出现错误,则触发Single.error,否则将触发带响应的Single.just() .

我尝试使用Observable而不是Single,我总是有冻结 .

编辑:postSearch方法

public static Single<SearchResponse> postSearch() {
    return new RequestService<SearchResponse>().launchRequest(getApi().postSearch());
}

getApi()方法:

private static MappingApi mappingApi;

private static MappingApi getApi() {
     if (mappingApi == null){
        mappingApi = MappingApi.Factory.create();
    }
    return mappingApi;
}

它返回launchRequest方法,使用param getApi().postSearch() 这是我在Api界面中使用url的POST声明

public interface MappingApi {
    class Factory {
        public static MappingApi create() {
            return RetrofitHelper.buildRetrofit().create(MappingApi.class);
        }
     }

     @POST("mapping/classifieds")
     Single<Response<SearchResponse>> postSearch();
}