目前项目使用的是json数据格式来实现移动端与后台的交互。之前使用的是android-async-http。感觉有点老了,于是试着使用Rxjava+RxAndorid+Retrofit+okhttp实现网络交互。
首先配置好文件,如下所示。注意目前测试成功下面相应的版本,其中okhttp依赖于okio。
/**okhttp+okio+retrofit+rxjava+rxandroid*/
implementation files('libs/okio-2.1.0.jar')
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation files('libs/kotlin-stdlib-1.3.11.jar')
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
//网络请求
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
编写Retrofit帮助类。
public class RetrofitHelper {
private static final int DEFAULT_TIME_OUT = 5;//超时时间 5s
private static final int DEFAULT_READ_TIME_OUT = 10;
private Retrofit mRetrofit;
private static RetrofitHelper instance = null;
private Context mCntext;
static private String BASE_URL=NetURL.URL_BASE;
public static RetrofitHelper getInstance(Context context){
if (instance == null){
instance = new RetrofitHelper(context);
}
return instance;
}
private RetrofitHelper(Context mContext){
this.mCntext=mContext;
// 创建 OKHttpClient
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//连接超时时间
builder.writeTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS);//写操作 超时时间
builder.readTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS);//读操作超时时间
// 创建Retrofit,这里有一个URL_BASE
mRetrofit = new Retrofit.Builder()
.baseUrl("http://192.168.10.155:8082/")
.client(builder.build())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //配置支持RJava2的 Observable
.addConverterFactory(GsonConverterFactory.create()) //设置数据解析器,会将返回的数据自动转换为 对应的 class
.build();
}
/**
* 获取对应的Service
* @param service
* @param <T>
* @return
*/
public <T> T create(Class<T> service) {
return mRetrofit.create(service);
}
}
网络连接部分。注意设置好头部。
public interface HttpService {
/*上传户籍数据*/
//需要添加头
@Headers({"Content-Type: application/json","Accept: application/json"})
@POST(NetURL.URL_HOLDER_UPLOAD)
Observable<ResponseBody> UpLoadHolder(@Body RequestBody requestBody);
}
发送请求。这里使用Gson转为json格式。
findViewById(R.id.btn_upload_test).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<JSONObject> mapList= UpLoadDataUtils.GetAllData(entityHolderInfoDao, new Creator<EntityHolderInfo>() {
@Override
public EntityHolderInfo create() {
return new EntityHolderInfo();
}
});
if (mapList.size()>0){
}
Gson gson = new Gson();
EntityHolderInfo entityHolderInfo=entityHolderInfoDao.loadAll().get(0);
EntityHolderInfo holderInfo=entityHolderInfo;
Map<String, Object> attrMaps = new HashMap<>();
attrMaps.put("holderinfo_holderid",holderInfo.getHolderinfo_holderid());
attrMaps.put("holderinfo_admincode",holderInfo.getHolderinfo_admincode());
attrMaps.put("holderinfo_holdertype",holderInfo.getHolderinfo_holdertype());
attrMaps.put("holderinfo_isprohome",holderInfo.getHolderinfo_isprohome());
attrMaps.put("holderinfo_holderaddres",holderInfo.getHolderinfo_holderaddres());
String jsonStr = gson.toJson(attrMaps);
Map<String, String> params = new HashMap<>();
params.put("json",jsonStr);
String requestStr = gson.toJson(params);
RequestBody requestBody=
RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),requestStr);
try {
RetrofitHelper.getInstance(UploadActivity.this).create(HttpService.class)
.UpLoadHolder(requestBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
int x=0;
}
@Override
public void onNext(ResponseBody s) {
int x=0;
}
@Override
public void onError(Throwable e) {
int x=0;
}
@Override
public void onComplete() {
int x=0;
}
});
}catch (Exception e){
e.toString();
}
}
});
最后是SpringMVC服务后台。
@RequestMapping(value = "holderUpload.do")
@ResponseBody
public Map<String,Object> holderUpload(@RequestBody String json){
Map<String,Object> map = new LinkedHashTreeMap<>();
Gson gson = new Gson();
if(json != null){
try{
Holder holder = gson.fromJson(json,Holder.class);
My_holderinfo holderinfo = holder.transformData();
holderinfo.setUptime(DateUtil.nowTime());
dongdiHolderinfoRe.saveOrUpdate(holderinfo);
map.put("flag",true);
map.put("data","success");
}
catch (DataIntegrityViolationException e){
e.printStackTrace();
map.put("flag",false);
map.put("data","101");
map.put("error",e.getRootCause().getMessage());
}
}
else{
map.put("flag",false);
map.put("data","100");
map.put("error","传输数据为空");
}
return map;
}
数据格式。
SpringMVC接收的到的json数据。
在onNext函数中,Android接收成功返回数据。