我想使用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
。请帮忙。
答案 0 :(得分:2)
尝试使用RxJava2 Adapter,它将为您节省很多!
步骤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步: APIService接口(示例)
@GET("endpoint")
Single<ResponseModel> fetch();
第3步:用法
Single<ResponseModel> fetch() {
return getRetrofitClient()
.create(APIService.class)
.fetch();
}
任何非2xx HTTP响应都将包装在HttpException
中,您可以从中提取状态代码,状态消息和完整的HTTP响应。
任何连接错误都将包裹在IOException
这就是将网络调用包装在任何RxJava流中所需要做的全部工作。