总体流程 定接口请求—》失败成功方法 每一层都要实现接口写逻辑
1.先定义最外层接口Get和Post可以自己添加
public interface IHttpProcessor { //这是工作的接口 //Post void Post(String url, Map<String,Object> params,ICallBack callBack); //Get void Get(String url, Map<String,Object> params,ICallBack callBack); //Del //Update }
2.在定义一个失败成功接口
interface ICallBack { //这里代表网络请求的行为 void onSuccess(String result); void onFailure(String erren); }
3.然后从成功开始解析字符串 失败的话就不用写了因为不需要解析
//这些就是网络请求的规范 //这个目的就是将网络层的数据String转换成Result这个泛型 达到成功解析的效果 当然retrofit底层已经封装好了 public abstract class HttpCallback<Result> implements ICallBack { @Override public void onSuccess(String result) { Gson gson = new Gson(); Class<?> cls=analysisClazInfo(this); Result objectResult = (Result) gson.fromJson(result, cls); onSuccess(objectResult); } //这是为了将转变之后的返回值数据直接传到上面去 这是为了能够成功的将String类型数据转换成Result类型 public abstract void onSuccess(Result result); public static Class<?> analysisClazInfo(Object object){ Log.d("aaaaaa", "analysisClazInfo: "+object.getClass().toString()); //得到object的超类 Type genericSuperclass = object.getClass().getGenericSuperclass(); Log.d("aaaaaa", "onSuccess: "+genericSuperclass.toString()); //将超类强转成参数化类型得到实际真正的类型 整个继承类的类名列表 Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments(); Log.d("aaaaaa", "onSuccess: "+actualTypeArguments[0]); return (Class<?>) actualTypeArguments[0]; } }
4.然后写Get和Post这层代码 这一层是用的代理模式
//这一层就是代理层 将数据传递到真正工作的类
//这里是代理层 为了将View层直接访问工作接口 public class HttpProxy implements IHttpProcessor { //公共需要的东西 private static IHttpProcessor mIHttpProcessor = null; private Map<String,Object> mParams = null; private HttpProxy(){ mParams=new HashMap<>(); } //这只是个单利 private static HttpProxy httpProxy; public static HttpProxy obtain(){ synchronized (HttpProxy.class){ if(httpProxy==null){ httpProxy=new HttpProxy(); } } return httpProxy; } public static void init(IHttpProcessor httpProcessor){ mIHttpProcessor=httpProcessor; } @Override public void Post(String url, Map<String, Object> params, ICallBack callBack) { final String finalUrl = appendParams(url, params); mIHttpProcessor.Post(finalUrl,params,callBack); } @Override public void Get(String url, Map<String, Object> params, ICallBack callBack) { final String finalUrl = appendParams(url, params); mIHttpProcessor.Get(finalUrl,params,callBack); } //这是接口后面的字符串的拼接 public static String appendParams(String url,Map<String,Object> params){ if (params == null || params.isEmpty()){ return url; } StringBuilder stringBuilder = new StringBuilder(url); //如果这个Url查到?符号的指数是零 那么表示没有就添加 if (stringBuilder.indexOf("?")<=0) { stringBuilder.append("?"); }else {//有的话就判断Url是不是?结尾的 如果不是就添加&字符 if(!stringBuilder.toString().endsWith("?")){ stringBuilder.append("&"); } } for (Map.Entry<String,Object> entry : params.entrySet()) { stringBuilder.append(entry.getKey()).append("=").append(entry.getValue().toString()); } return stringBuilder.toString(); } //Url不允许有空格等字符,如果参数值有空格,需要此方法转换 private static String encode(String str){ try { return URLEncoder.encode(str,"utf-8"); } catch (UnsupportedEncodingException e) { //针对不支持的编码时报错,utf-8应该支持 Log.d("aaaaaa", "encode: "+e.toString()); throw new RuntimeException(e); } } }
5.最后一个就是工作类 就是从上面的那个类传递过来的 这里的话可以换框架
public class OkhttpProcessor implements IHttpProcessor { private OkHttpClient mOkHttpClient; private Handler myHandler; public OkhttpProcessor(){ mOkHttpClient = new OkHttpClient(); myHandler = new Handler(); } @Override public void Post(String url, Map<String, Object> params, final ICallBack callBack) { Log.d("aaaaaa", "Post: "); RequestBody requestBody = appendBody(params); Request request = new Request.Builder() .url(url) .post(requestBody) .header("User-Agent", "a")//这句话必须加 不然会报错 因为当时okhttp开发的时候没有考虑到中文服务器和编解码 后面的a代表中国的 .build(); mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { //运行在主线程将数据传递出去 myHandler.post(new Runnable() { @Override public void run() { callBack.onFailure(e.toString()); } }); } @Override public void onResponse(Call call, final Response response) throws IOException { if(response.isSuccessful()){ final String result = response.body().string(); //运行在主线程将数据传递出去 myHandler.post(new Runnable() { @Override public void run() { callBack.onSuccess(result); } }); }else { //运行在主线程将数据传递出去 myHandler.post(new Runnable() { @Override public void run() { callBack.onFailure(response.toString()); } }); } } }); } @Override public void Get(String url, Map<String, Object> params, ICallBack callBack) { } //body拼接 private RequestBody appendBody(Map<String,Object> params){ FormBody.Builder body = new FormBody.Builder(); if(params == null || params.isEmpty()){ return body.build(); } for (Map.Entry<String,Object> entry:params.entrySet()) { body.add(entry.getKey(),entry.getValue().toString()); } return body.build(); } }
6.gson的话就是实体类 你可以自己创建我这边也给你打包好了 一并奉上
public class gson { /** * postid : PHOT24LDT000100A * series : * clientadurl : * desc : 4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。 * datatime : 2017-09-20 13:37:29 * createdate : 2017-04-16 14:23:34 * relatedids : [] * scover : http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLG00AP0001.jpg * autoid : * url : http://news.163.com/photoview/00AP0001/2250173.html * creator : 耿旭娜 * reporter : * photos : [{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLD00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLD00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLD00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLD00AP0001.jpg","imgtitle":"","simgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLD00AP0001.jpg","note":"4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报)","photoid":"CI5B3HLD00AP0001","imgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLD00AP0001.jpg"},{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLE00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLE00AP0001","newsurl":"#","squareimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLE00AP0001.jpg","cimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLE00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLE00AP0001.jpg","note":"网友们纷纷调侃:这不是晚上么?有网友说:\u201c白天不懂夜的黑\u201d(来源:四川日报)","photoid":"CI5B3HLE00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLE00AP0001.jpg"},{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLF00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLF00AP0001","newsurl":"#","squareimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLF00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLF00AP0001.jpg","imgtitle":"","simgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLF00AP0001.jpg","note":"达州市气象台发布天气预报:16日有雷阵雨,雨量中到大雨,局地暴雨。(来源:四川日报)","photoid":"CI5B3HLF00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLF00AP0001.jpg"},{"timgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLG00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLG00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLG00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLG00AP0001.jpg","imgtitle":"","simgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLG00AP0001.jpg","note":"4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报)","photoid":"CI5B3HLG00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLG00AP0001.jpg"},{"timgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLH00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLH00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLH00AP0001.jpg","cimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLH00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLH00AP0001.jpg","note":"网友们纷纷调侃:这不是晚上么?有网友说:\u201c白天不懂夜的黑\u201d(来源:四川日报)","photoid":"CI5B3HLH00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLH00AP0001.jpg"},{"timgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLI00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLI00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLI00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLI00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLI00AP0001.jpg","note":"达州市气象台发布天气预报:16日有雷阵雨,雨量中到大雨,局地暴雨。(来源:四川日报)","photoid":"CI5B3HLI00AP0001","imgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLI00AP0001.jpg"},{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLJ00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLJ00AP0001","newsurl":"#","squareimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLJ00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLJ00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLJ00AP0001.jpg","note":"4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报)","photoid":"CI5B3HLJ00AP0001","imgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLJ00AP0001.jpg"}] * setname : 四川达州雨前黑云压城 白昼如夜刷爆朋友圈 * neteasecode : * cover : http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLG00AP0001.jpg * hideAd : false * commenturl : http://comment.news.163.com/photoview_bbs/PHOT24LDT000100A.html * source : 四川日报 * settag : 四川,黑云,白昼 * boardid : photoview_bbs * tcover : http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLG00AP0001.jpg * imgsum : 7 */ private String postid; private String series; private String clientadurl; private String desc; private String datatime; private String createdate; private String scover; private String autoid; private String url; private String creator; private String reporter; private String setname; private String neteasecode; private String cover; private boolean hideAd; private String commenturl; private String source; private String settag; private String boardid; private String tcover; private String imgsum; @Override public String toString() { return "gson{" + "postid='" + postid + '\'' + ", series='" + series + '\'' + ", clientadurl='" + clientadurl + '\'' + ", desc='" + desc + '\'' + ", datatime='" + datatime + '\'' + ", createdate='" + createdate + '\'' + ", scover='" + scover + '\'' + ", autoid='" + autoid + '\'' + ", url='" + url + '\'' + ", creator='" + creator + '\'' + ", reporter='" + reporter + '\'' + ", setname='" + setname + '\'' + ", neteasecode='" + neteasecode + '\'' + ", cover='" + cover + '\'' + ", hideAd=" + hideAd + ", commenturl='" + commenturl + '\'' + ", source='" + source + '\'' + ", settag='" + settag + '\'' + ", boardid='" + boardid + '\'' + ", tcover='" + tcover + '\'' + ", imgsum='" + imgsum + '\'' + ", relatedids=" + relatedids + ", photos=" + photos + '}'; } private List<?> relatedids; private List<PhotosBean> photos; public String getPostid() { return postid; } public void setPostid(String postid) { this.postid = postid; } public String getSeries() { return series; } public void setSeries(String series) { this.series = series; } public String getClientadurl() { return clientadurl; } public void setClientadurl(String clientadurl) { this.clientadurl = clientadurl; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getDatatime() { return datatime; } public void setDatatime(String datatime) { this.datatime = datatime; } public String getCreatedate() { return createdate; } public void setCreatedate(String createdate) { this.createdate = createdate; } public String getScover() { return scover; } public void setScover(String scover) { this.scover = scover; } public String getAutoid() { return autoid; } public void setAutoid(String autoid) { this.autoid = autoid; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getCreator() { return creator; } public void setCreator(String creator) { this.creator = creator; } public String getReporter() { return reporter; } public void setReporter(String reporter) { this.reporter = reporter; } public String getSetname() { return setname; } public void setSetname(String setname) { this.setname = setname; } public String getNeteasecode() { return neteasecode; } public void setNeteasecode(String neteasecode) { this.neteasecode = neteasecode; } public String getCover() { return cover; } public void setCover(String cover) { this.cover = cover; } public boolean isHideAd() { return hideAd; } public void setHideAd(boolean hideAd) { this.hideAd = hideAd; } public String getCommenturl() { return commenturl; } public void setCommenturl(String commenturl) { this.commenturl = commenturl; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getSettag() { return settag; } public void setSettag(String settag) { this.settag = settag; } public String getBoardid() { return boardid; } public void setBoardid(String boardid) { this.boardid = boardid; } public String getTcover() { return tcover; } public void setTcover(String tcover) { this.tcover = tcover; } public String getImgsum() { return imgsum; } public void setImgsum(String imgsum) { this.imgsum = imgsum; } public List<?> getRelatedids() { return relatedids; } public void setRelatedids(List<?> relatedids) { this.relatedids = relatedids; } public List<PhotosBean> getPhotos() { return photos; } public void setPhotos(List<PhotosBean> photos) { this.photos = photos; } public static class PhotosBean { /** * timgurl : http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLD00AP0001.jpg * photohtml : http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLD00AP0001 * newsurl : # * squareimgurl : http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLD00AP0001.jpg * cimgurl : http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLD00AP0001.jpg * imgtitle : * simgurl : http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLD00AP0001.jpg * note : 4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报) * photoid : CI5B3HLD00AP0001 * imgurl : http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLD00AP0001.jpg */ private String timgurl; private String photohtml; private String newsurl; private String squareimgurl; private String cimgurl; private String imgtitle; private String simgurl; private String note; private String photoid; private String imgurl; @Override public String toString() { return "PhotosBean{" + "timgurl='" + timgurl + '\'' + ", photohtml='" + photohtml + '\'' + ", newsurl='" + newsurl + '\'' + ", squareimgurl='" + squareimgurl + '\'' + ", cimgurl='" + cimgurl + '\'' + ", imgtitle='" + imgtitle + '\'' + ", simgurl='" + simgurl + '\'' + ", note='" + note + '\'' + ", photoid='" + photoid + '\'' + ", imgurl='" + imgurl + '\'' + '}'; } public String getTimgurl() { return timgurl; } public void setTimgurl(String timgurl) { this.timgurl = timgurl; } public String getPhotohtml() { return photohtml; } public void setPhotohtml(String photohtml) { this.photohtml = photohtml; } public String getNewsurl() { return newsurl; } public void setNewsurl(String newsurl) { this.newsurl = newsurl; } public String getSquareimgurl() { return squareimgurl; } public void setSquareimgurl(String squareimgurl) { this.squareimgurl = squareimgurl; } public String getCimgurl() { return cimgurl; } public void setCimgurl(String cimgurl) { this.cimgurl = cimgurl; } public String getImgtitle() { return imgtitle; } public void setImgtitle(String imgtitle) { this.imgtitle = imgtitle; } public String getSimgurl() { return simgurl; } public void setSimgurl(String simgurl) { this.simgurl = simgurl; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public String getPhotoid() { return photoid; } public void setPhotoid(String photoid) { this.photoid = photoid; } public String getImgurl() { return imgurl; } public void setImgurl(String imgurl) { this.imgurl = imgurl; } } }
7.在使用前的话还需要初始化一下 创建一个类在app启动时知道执行里面的方法
public class MyAppcation extends Application { @Override public void onCreate() { super.onCreate(); //代理层和框架层建立连接 HttpProxy.init(new OkhttpProcessor()); } }
8.然后在你的清单文件里面添加这一句
9.然后就可以正常使用
public class MainActivity extends AppCompatActivity { private String url="http://c.3g.163.com/photo/api/set/0001%2F2250173.json"; private HashMap<String,Object> params=new HashMap<String,Object>(); private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView=findViewById(R.id.tv_show); } public void onClick(View view) { HttpProxy.obtain().Post(url,params,new HttpCallback<gson>(){ @Override public void onFailure(String erren) { Log.d("aaaaaa", "onFailure: "+erren.toString()); } @Override public void onSuccess(gson result) { textView.setText(result.toString()); } }); } }