我正在使用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();
}