Android编程至高武学之《如来神掌》第四式~佛问迦蓝
来源:互联网 发布:如何鉴别蜜蜡优化 编辑:程序博客网 时间:2024/04/30 23:32
上回书Android编程至高武学之《如来神掌》第三式~佛动山河,初试牛刀,已经为大家九牛剃了一毛了。今天为大家带来一个比较常用的网络框架。在浩瀚的网络架构中,大家肯定已经有了选择恐惧症,不知道从哪一个下手。说实话,臣妾之前也用过好几个网络框架,从asynctask到okhttp,最终发现还是后者像每天劳累回家给你做饭的媳妇依然辣么好。那么,请别犹豫,寡人今天为大家带来一个最的。废话不多说,上代码:
package net.neiquan.okhttp;import android.content.Context;import android.content.Intent;import android.os.Handler;import android.os.Looper;import android.util.Pair;import com.alibaba.fastjson.JSON;import net.neiquan.okhttp.body.BodyWrapper;import net.neiquan.okhttp.builder.UploadRequestBuilder;import net.neiquan.okhttp.listener.DownloadListener;import net.neiquan.okhttp.listener.UploadListener;import org.haitao.common.utils.AppLog;import org.haitao.common.utils.ToastUtil;import java.io.File;import java.io.IOException;import java.util.List;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class OkHttpUtils { private static Handler mHandler = new Handler(Looper.getMainLooper()); private static OkHttpClient mHttpClient ; private static OkHttpUtils okHttpUtils ; /** * 是否已经在主界面了 登录的时候要重置为 false */ public static boolean alreadyInHome; private static Context context; public static void init(Context _context){ context=_context; } public static void init(Context _context,Class<?> skpCls){ context=_context; cls=skpCls; } private static Class<?> cls; public static void SetSessionOutCls(Class<?> _cls){ cls=_cls; } // 上面的代码主要是为了 过期跳转主页 private static OkHttpUtils init() { synchronized (OkHttpUtils.class) { if (mHttpClient == null) { mHttpClient = new OkHttpClient(); okHttpUtils =new OkHttpUtils(); } } return okHttpUtils; } public static OkHttpUtils getInstance() { return mHttpClient == null ? init() : okHttpUtils; } /** * get 同步 * @param url * @param netCallBack * @param type */ public void get(String url, final NetCallBack netCallBack, final Class type){ get(url,null,netCallBack,type); } /** * get 同步 * @param url * @param map * @param netCallBack * @param type */ public void get(String url, Map<String, String> map, final NetCallBack netCallBack, final Class type){ url= appendGetParams(url,map); Request request = new Request.Builder() .url(url) .build(); sync(map,request,netCallBack,type); } /** * get异步 * @param url * @param netCallBack * @param type */ public void getAnsy(String url, final NetCallBack netCallBack, final Class type){ getAnsy(url,null,netCallBack,type); } /** * get异步 * @param url * @param map 请求参数 * @param netCallBack * @param type */ public void getAnsy(String url, Map<String, String> map, final NetCallBack netCallBack, final Class type){ url= appendGetParams(url,map); Request request = new Request.Builder() .url(url) .build(); async(map,request,netCallBack,type); } /** * post 同步 * @param url * @param netCallBack * @param type */ public void post(String url, final NetCallBack netCallBack, final Class type){ post(url,null,netCallBack,type); } /** * post 同步 * @param url * @param map 请求参数 * @param netCallBack * @param type */ public void post(String url, Map<String, Object> map, final NetCallBack netCallBack, final Class type){ RequestBody body = appendPostParams(map); Request request = new Request.Builder() .url(url) .post(body) .build(); sync(map,request,netCallBack,type); } /** * 异步post * @param url * @param netCallBack * @param type */ public void postAnsy(String url, final NetCallBack netCallBack, final Class type){ postAnsy(url,null,netCallBack,type); } /** * 异步post * @param url * @param map 请求参数 * @param netCallBack * @param type */ public void postAnsy(String url, Map<String, Object> map, final NetCallBack netCallBack, final Class type){ RequestBody body = appendPostParams(map); Request request = new Request.Builder() .url(url) .post(body) .build(); async(map,request,netCallBack,type); } /** * 异步post json * @param url * @param map 请求参数 * @param netCallBack * @param type */ public void postJsonAnsy(String url, Map<String, Object> map, final NetCallBack netCallBack, final Class type){ postJsonAnsy(url, JSON.toJSONString(map),netCallBack,type); } /** * 异步post json * @param url * @param json 请求参数 * @param netCallBack * @param type */ public void postJsonAnsy(String url, String json, final NetCallBack netCallBack, final Class type){ MediaType JSON = MediaType.parse("application/json; charset=utf-8");// MediaType JSON = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"); RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder().url(url).post(body).build(); async(json,request,netCallBack,type); } /** * 同步 * @param request * @param netCallBack * @param type */ private void sync(Object requstPram,final Request request, final NetCallBack netCallBack, final Class type){ AppLog.e("url "+request.url()+" "+requstPram); Response response = null; try { response = mHttpClient.newCall(request).execute(); // 网络请求成功 if (response.isSuccessful()) { paserResponse (requstPram,response,netCallBack,type); }else{ paserFail(requstPram,request,response.code(),netCallBack); } } catch (IOException e) { e.printStackTrace(); } } /** * 异步 * @param request * @param netCallBack * @param type */ private void async(final Object requstPram,Request request, final NetCallBack netCallBack, final Class type){ AppLog.e("url "+request.url()+" "+requstPram); mHttpClient.newCall(request).enqueue(new Callback(){ @Override public void onFailure(Request request, IOException e) { paserFail(requstPram,request,404,netCallBack); } @Override public void onResponse(Response response) throws IOException { paserResponse (requstPram,response,netCallBack,type); } }); } /** * 下载文件 有进度显示 * @param url * @param downloadListener * @return */ public Call download(String url, DownloadListener downloadListener) { Request request = new Request.Builder().url(url).build(); Call call = BodyWrapper.addProgressResponseListener(mHttpClient, downloadListener).newCall(request); call.enqueue(downloadListener); return call; } /** * 异步post 上传文件 * @param url * @param file * @param map * @param uploadListener */ public void postFile(String url, Pair<String, File> file,Map<String, String> map, UploadListener uploadListener){ new UploadRequestBuilder() .url(url) .file(file) .setParams(map) .setWriteTimeOut(20) .start(mHttpClient ,uploadListener); } /** * 创建 get 参数 * @param url * @param params * @return */ protected String appendGetParams(String url, Map<String, String> params) { StringBuilder sb = new StringBuilder(); sb.append(url + "?"); if (params != null && !params.isEmpty()) { for (String key : params.keySet()) { sb.append(key).append("=").append(params.get(key)).append("&"); } } sb = sb.deleteCharAt(sb.length() - 1); return sb.toString(); } /** * 创建 post参数 * @param map * @return */ private RequestBody appendPostParams(Map<String, Object> map){ // 创建请求的参数body FormBody.Builder builder = new FormBody.Builder(); /** * 遍历key */ if (null != map) { for (Map.Entry<String, Object> entry : map.entrySet()) { builder.add(entry.getKey(), entry.getValue().toString()); } } RequestBody body = builder.build(); return body; } /** * @param requstPram * @param request * @param code * @param netCallBack */ private void paserFail(Object requstPram,Request request,final int code, final NetCallBack netCallBack){ AppLog.e("fail url "+request.url()+" code "+code+" " +requstPram); if (netCallBack!=null){ mHandler.post(new Runnable() { @Override public void run() { // onFailure(e); if ( netCallBack!=null){ netCallBack.onFail(true,code,""); } } }); } } /** * 处理成功结果 * @param response * @param netCallBack */ private void paserResponse (Object requstPram,final Response response, final NetCallBack netCallBack, final Class type){ String res=""; try { res =response.body().string(); } catch (IOException e) { e.printStackTrace(); mHandler.post(new Runnable() { @Override public void run() { netCallBack.onFail(true,0,"no data"); } }); } AppLog.jsonAppend("========= url ========"+response.request().url().toString()+"\nrquestbody "+requstPram+"\n" + "code:"+response.code()+"\nresult:",res); if (response.isSuccessful()){ if (netCallBack!=null){ final Result result = JSON.parseObject(res, Result.class); if(result.getCode()==0){ //服务器逻辑成功 //判断 是否有对象 final ResultModel body = new ResultModel(); if(null!=type){ // 判断是jsonObject 还是 jsonArray if (result.getResponse()!=null){ if (isJsonArray(result.getResponse())){ List<?> ls = JSON.parseArray(result.getResponse(), type); body.setModelList(ls); }else{ body.setModel(JSON.parseObject(result.getResponse(), type)); } mHandler.post(new Runnable() { @Override public void run() { netCallBack.onSuccess(result.getResponse(),result.getErrorMessage(),body); } }); }else{ // 服务器没有返回对象 mHandler.post(new Runnable() { @Override public void run() { netCallBack.onFail(true,0,"no data"); } }); } }else{ mHandler.post(new Runnable() { @Override public void run() { netCallBack.onSuccess(result.getResponse(),result.getErrorMessage(),null); } }); } }else{ mHandler.post(new Runnable() { @Override public void run() { netCallBack.onFail(false,result.getCode(),result.getErrorMessage()); // } }); if (result.getCode()==50||result.getCode()==51){ // 登录 if (!alreadyInHome && context!=null && cls!=null) { alreadyInHome=true; // 防止多次跳转 Intent intent = new Intent(context,cls); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("sessionOut", true); context.startActivity(intent); ToastUtil.shortShowToast(result.getErrorMessage()); } } } } }else{ if (netCallBack!=null){ mHandler.post(new Runnable() { @Override public void run() { netCallBack.onFail(false,response.code(),"server error"); } }); } } } /** * 判断是否是json数组 * @param str * @return */ public boolean isJsonArray(String str){ final char[] strChar = str.substring(0, 1).toCharArray(); final char firstChar = strChar[0]; return firstChar == '[' ; }}
当然,该配置的自行百度吧,都是很简单的,度娘知道怎么做。至于具体用法,也是相当的不难。:
1.比如说获取验证码接口:
/** * @param phone 需要传入的参数(手机号码) * @param whoNeedIdenCode 需要传入的参数(哪种情况获取验证码) * @param callback 回调 * @param classType 回调后返回的实体类 */ public void getCaptcha(String phone, String whoNeedIdenCode, final NetCallBack callback, final Class classType) { Map<String, Object> params = new HashMap<String, Object>(); params.put("phone", phone); params.put("whoNeedIdenCode", whoNeedIdenCode); norPost(APPURL.CAPTCHA, params, callback, classType); }
2.请求的方法(结合OkHttpUtils) public void norPost(String url, Map<String, Object> map, final NetCallBack callback, final Class classType) { if (map == null) { map = new HashMap<String, Object>(); } User user = MyApplication.getInstance().user; if (user != null) { map.put("userid",user.getUser().getId()); map.put("token",user.getToken()); } // map.put("deviceType", 0+""); // 拼接userid OkHttpUtils.getInstance().postJsonAnsy(url, map, callback, classType); }
总体来说说,只需要手写一下步骤2,就行了,一个请求就诞生了!当然,如果您实在是不太理解,或者不怎么会用,那么请观看俺的上一篇博客Android编程至高武学之《如来神掌》第二式~金顶佛灯 。或者直接去下载demo,https://Git.oschina.NET/bjnq/NeiquanDemo,运行后里面直接有用法。本回书完,下回还是分解一下上上篇博客给大家贡献的demo,敬请期待.....
0 0
- Android编程至高武学之《如来神掌》第四式~佛问迦蓝
- Android编程至高武学之《如来神掌》第一式~佛光初现
- Android编程至高武学之《如来神掌》第二式~金顶佛灯
- Android编程至高武学之《如来神掌》第三式~佛动山河
- Android编程至高武学之《如来神掌》第五式~迎佛西天
- Ext.FormPanel之第四式
- 《如来神掌》详细攻略
- Rails宝典之第四式: 将查询移位Model
- [从头学绘画] 第07节 二十四式太极拳(1-6)
- [从头学绘画] 第08节 二十四式太极拳(7-12)
- [从头学绘画] 第09节 二十四式太极拳(13-18)
- [从头学绘画] 第11节 二十四式太极拳(19-24)
- [从头学绘画] 第12节 六十四式八卦掌 (1-8)
- [从头学绘画] 第13节 六十四式八卦掌 (9-16)
- [从头学绘画] 第14节 六十四式八卦掌 (17-24)
- [从头学绘画] 第15节 六十四式八卦掌 (25-32)
- [从头学绘画] 第16节 六十四式八卦掌 (33-40)
- [从头学绘画] 第17节 六十四式八卦掌 (41-48)
- html是什么,html5是什么?web开发必备知识之html
- WinServer2008下IIS8如何给网站配置域名/IP来访问
- Linux配置ssh使用key登录
- SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
- 自动瘦脸与眼睛放大美颜算法
- Android编程至高武学之《如来神掌》第四式~佛问迦蓝
- java 模版,有前后台,springmvcSSM,freemaker 企业网站源码,
- 百度HR给的JS面试题
- poj 3411Paid Roads(走重复点的dfs )
- 我个人比较受用的一些习惯
- MIPS寄存器说明
- jquery 处理 CheckBox复选框
- Retrofit全攻略——基础篇
- 通过面试题去认识原型