总体流程 定接口请求—》失败成功方法 每一层都要实现接口写逻辑
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());
}
});
}
}