在android開發中,偶爾會遇到需要 將一個網絡請求單獨寫 的需求
因爲大框架不會因爲一絲絲小改動,而去改變
下面簡單介紹一下用OKHttp+RxJava,進行網絡請求
並且回調更新UI
下面上一段代碼:
protected void srvGetData(String idCard, String startTime, String endTime) {
mDialog.show();
HashMap<String, String> params = HttpClienrFactory.newGeneralParams();
params.put("startTime", startTime);
params.put("endTime", endTime);
params.put("idCard", idCard);
String sign = null;
try {
sign = SignUtils.generateSign(params);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
params.put("sign", sign);
Observable.just(params)
.map(new Function<HashMap<String, String>, PovertyBean>() {
@Override
public PovertyBean apply(HashMap<String, String> params) throws Exception {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(45, TimeUnit.SECONDS)//設置讀取超時時間
.writeTimeout(45, TimeUnit.SECONDS)//設置寫的超時時間
.connectTimeout(45, TimeUnit.SECONDS)//設置連接超時時間
.build();
FormBody.Builder builder = new FormBody.Builder();
for (HashMap.Entry<String, String> map : params.entrySet()) {
builder.add(map.getKey(), map.getValue());
}
FormBody body = builder.build();
Request.Builder reqBuilder = new Request.Builder();
for (HashMap.Entry<String, String> map : HttpClienrFactory.newGeneralHeader().entrySet()) {
reqBuilder.header(map.getKey(), map.getValue());
}
Request request = reqBuilder
.url(UrlConstants.SERVE_GET_REDEEM_GATHER)
.post(body)
.build();
Logger.i(TAG, "request = " + request.url());
Call call = okHttpClient.newCall(request);
Response response = call.execute();
String json = response.body().string();
PovertyBean povertyBean = new Gson().fromJson(json, PovertyBean.class);
return povertyBean;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
mDialog.dismiss();
Toast.makeText(getApplicationContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
}
})
.subscribe(new Consumer<PovertyBean>() {
@Override
public void accept(PovertyBean povertyBean) throws Exception {
mDialog.dismiss();
if (povertyBean == null
|| povertyBean.data == null
|| povertyBean.data.redeemGatherResultEntity == null) {
return;
}
updatePovertyUI(povertyBean.data.redeemGatherResultEntity);
}
});
}
subscribeOn: 指定 map 一類的操作在哪個線程
observeOn: 指定 subscribe 回調在哪個線程
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
doOnError(): 當數據處理的過程中(map一類的操作), 發現異常.將統一走到 doOnError() 方法中.
可以在這個doOnError()方法內處理錯誤消息
非常簡單的用法!