重构原因: 源代码在编写时需要写很长的准备参数,赶回数据还需要做解析处理,为了能够让减少准备参数,并且得到后的数据自动做解析操作,于是产生了我对代码重构的想法 重构前代码调用的例子 HashMap<String,String> mMap = new HashMap<>(); mMap.put("projectId",getIntentProjectData().get(proIndex).getProId()); //map转Json格式 JSONObject jsonObj = JSONObject.fromObject(mMap); HashMap<String,String> pMap = new HashMap<>(); pMap.put("string",jsonObj.toString()); WebServiceUtils.callWebService(this,true,WebServiceUtils.WEB_SERVER_PROJECT_URL, "getRectificationPsnInProject",pMap,WebServiceUtils.NAMESPACE_USER, new WebServiceUtils.WebServiceCallBack() { @Override public void callBack(SoapObject result) { //解析SoapObject类型的数据(转换成Json格式,放在Map里面) if(result != null){ //关闭进度条 ProgressDialogUtils.dismissProgressDialog(); sMap = WebServiceUtils.setMap(result); ZhenggairenBeanList = processData((sMap.get("return")).toString()).getData(); SourceDateList = filledData(ZhenggairenBeanList); // 根据a-z进行排序源数据 SourceDateList = PaiXu(SourceDateList); adapter = new RectificationListAdapter(Screening_Zhenggai_Activity.this,ZhenggairenBeanList); try{ zhenggai_listView.setAdapter(adapter);}catch (Exception e){ e.printStackTrace(); } } } }); 重构后构想的代码例子 HashMap<String,String> mMap = new HashMap<>(); mMap.put("projectId",getIntentProjectData().get(proIndex).getProId()); TforWebServiceForBeanUtils.callWebService(this,true,TforWebServiceForBeanUtils.WEB_SERVER_PROJECT_URL, "getRectificationPsnInProject",mMap,TforWebServiceForBeanUtils.NAMESPACE_USER, List.class,new TforWebServiceForBeanUtils.WebServiceCallBack<List<Zhenggairen_Bean.DataBean>>() { @Override public void callBack(List<Zhenggairen_Bean.DataBean> resultObject) { SourceDateList = filledData(resultObject); // 根据a-z进行排序源数据 SourceDateList = PaiXu(SourceDateList); adapter = new RectificationListAdapter(Screening_Zhenggai_Activity.this,ZhenggairenBeanList); try{ zhenggai_listView.setAdapter(adapter);}catch (Exception e){ e.printStackTrace(); } } }); 很明显,我如果重构成功后,准备参数少了不说,而且得到的对象可以直接复用,这将大大减少所需要的无用代码量 代码有点长 ,先贴到子文件中 重构代码最难解决的是,如何自动解析json回来的字符串 json大体格式如下 data : 0001ZZ1000000002JV3U resultCode : 1 但是data中有单个对象,有list,还可能有map,当时没有想太多 直接用这种方式解决了 TforBaseResult baseResult = fromJson(resultMap.get("return").toString(), (Class) t); 把泛型t进行解析 ,结果对单个对象是有用的,对于对象中list 里面map<string,String>无法解析 于是想到了这样的方式解决 TforBaseResult<List<Map<String,String>>> baseResult = new Gson().fromJson(resultMap.get ("return").toString(), type); for(int i=0; i<baseResult.getData().size();i++){ for (String key : baseResult.getData().get(i).keySet()) { Log.e("candy","key= " + key + " and value= " + baseResult.getData().get(i).get(key)); } } 虽然里面的map被解析了,但是如何生成对应的对象还是一个问题,还有,如果里面只有一个map,也就是说只有一个对象,那如果智能识别,现在还是一个问题,总结 这次的重构代码失败,无法进行重构操作 经验总结:本次重构中,遇到主要问题是对泛型T的操作不足,也不知道如果去智能操作对象,直接传Class字节码文件也不太可能,用泛型也无法操作这个问题,这个问题目前先记录下来,日后再说
记一次WebService失败重构
最新推荐文章于 2022-03-28 14:28:12 发布