我想用Retrofit + RxJava发送POST请求,但它失败了,我不知道原因。在一个活动中它正在工作,在另一个活动中 - 不想工作:
private void sendMerchantInfo() {
try {
String advertiserOriginalDeepLink = "https://mywebsite.com/main-1?param1=value1¶m2=value2";
String urlGetParams = LinkParser.getUrlGETParams(advertiserOriginalDeepLink);
Map<Object, Object> merchantInfo = LinkParser.parseUrlGetParams(urlGetParams);
String merchantInfoJson = new Gson().toJson(merchantInfo); //{"param1":"value1","param2":"value2"}
String url = "https://api.endpoint.com/v1/system/merchant/process";
userService = this.serviceGenerator.createService(UserService.class, true);
final Observable observable = userService.sendUserInfo(
url, new RetrofitMapBody(merchantInfo))
.doOnNext(new Consumer<ResponseBody>() {
@Override
public void accept(ResponseBody responseBody) throws Exception {
//handle 200 OK.
}
})
.onErrorResumeNext((ObservableSource<? extends ResponseBody>) v ->
Crashlytics.log("Send user info attempt failed."))
.subscribeOn(Schedulers.from(threadExecutor))
.observeOn(postExecutionThread.getScheduler());
addDisposable(observable.subscribe());
}
} catch (Exception exception) {
Crashlytics.log("Send user info attempt failed. " + exception.getMessage());
}
}
我怀疑这部分有问题,我正在尝试以OnCreate()
方法发送请求:
.subscribeOn(Schedulers.from(threadExecutor))
.observeOn(postExecutionThread.getScheduler());
尝试使用它,但没有效果:
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
我做错了什么?它总是调用onErrorResumeNext()
这可能是线程的东西,因为有一次我得到了例外:networkonmainthreadexception
.请帮忙。
尝试使用 RxJava2 适配器,它会为您节省很多!
步骤 1:改造客户端设置
private Retrofit getRetrofitClient() {
return new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //option 1
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.newThread())) //option 2
.build();
}
第 2 步:API 服务接口(示例(
@GET("endpoint")
Single<ResponseModel> fetch();
第 3 步:用法
Single<ResponseModel> fetch() {
return getRetrofitClient()
.create(APIService.class)
.fetch();
}
任何非 2xx HTTP 响应都将包装在
HttpException
中,您可以从中提取状态代码、状态消息和完整的 HTTP 响应。任何连接错误都将包含在
IOException
这就是将网络调用包装在任何 RxJava 流中所需做的一切。