第一步:添加依赖:

  1. implementation 'com.lzy.net:okgo:3.0.4'
  2. implementation 'com.lzy.net:okrx2:2.0.2'
  3. implementation 'com.lzy.net:okserver:2.0.5'

第二步: 创建HttpManager:示例:

  1. import android.content.Context;
  2.  
  3. import com.lzy.okgo.OkGo;
  4. import com.shiwen.oil.bean.result.DailyDataResult;
  5. import com.shiwen.oil.constant.HttpUrlConstants;
  6. import com.shiwen.oil.util.JsonParseUtil;
  7.  
  8. import org.json.JSONObject;
  9.  
  10. /**
  11. * 网络请求管理类
  12. */
  13. public class HttpManager {
  14. private volatile static HttpManager instance;
  15.  
  16. private HttpManager(Context mContext) {
  17. }
  18.  
  19. public static HttpManager getInstance(Context mContext) {
  20. if (instance == null) {
  21. synchronized (HttpManager.class) {
  22. if (instance == null) {
  23. instance = new HttpManager(mContext);
  24. }
  25. }
  26. }
  27. return instance;
  28. }
  29.  
  30. public void getDialyData( String ksrq, HttpStringResponseHandler<DailyDataResult> handler) {
  31. OkGo.<String>post(HttpUrlConstants.HTTP_URL + HttpUrlConstants.DAILY_DATA_URL)
  32. .params("ksrq",ksrq)
  33. .execute(handler);
  34. }
  35.  
  36. public void getLoanOrderLists(GetLoanOrderParams postParams, Context context, HttpStringResponseHandler<GetLoanOrderListsResult> handler) {
  37. JSONObject jsonRequest = JsonParseUtil.beanParseJson(HttpUrlConstants.GETLOANORDERLIST, postParams, context);
  38. OkGo.<String>post(HttpUrlConstants.HTTP_URL + HttpUrlConstants.GETLOANORDERLIST)
  39. .upJson(jsonRequest)
  40. .execute(handler);
  41. }
  1. public void loanImg(File file, Context context, HttpStringResponseHandler<LoanImgResult> handler) {
  2. FileUtils.compressImageToFile(file);
  3. OkGo.<String>post(HttpUrlConstants.HTTP_URL + HttpUrlConstants.LOANIMG)
  4. .params("userid", ConfigConstants.getUid(context))
  5. .params("image", file)
  6. .execute(handler);
  7. }
  1.  
  1. }

第三步:创建JsonParseUtil:

  1. import android.content.Context;
  2.  
  3. import com.google.gson.Gson;
  4. import com.google.gson.JsonParseException;
  5.  
  6. import org.codehaus.jackson.map.JsonMappingException;
  7. import org.codehaus.jackson.map.ObjectMapper;
  8. import org.json.JSONArray;
  9. import org.json.JSONException;
  10. import org.json.JSONObject;
  11.  
  12. import java.io.IOException;
  13. import java.lang.reflect.Array;
  14. import java.lang.reflect.Field;
  15. import java.lang.reflect.InvocationTargetException;
  16. import java.lang.reflect.Method;
  17. import java.util.ArrayList;
  18. import java.util.Arrays;
  19. import java.util.Collections;
  20. import java.util.List;
  21.  
  22. public class JsonParseUtil {
  23. private static ObjectMapper objectMapper = new ObjectMapper();
  24.  
  25. public JsonParseUtil() {
  26. }
  27.  
  28. public static JSONObject beanParseJson(String method, Object request, Context mContext) {
  29. Gson gson = new Gson();
  30. JSONObject json = null;
  31. try {
  32. if (request != null) {
  33. json = new JSONObject(gson.toJson(request));
  34. } else {
  35. json = new JSONObject();
  36. }
  37.  
  38. // json.put("userid", ConfigConstants.getToken(mContext));
  39. } catch (JSONException e) {
  40. e.printStackTrace();
  41. }
  42. return json;
  43. }
  44.  
  45. public static Object jsonParseResponse(JSONObject json, Class... responses) {
  46. Object obj = null;
  47. if (responses.length > 1) {
  48. try {
  49. obj = responses[0].newInstance();
  50. Field[] var6;
  51. int var5 = (var6 = responses[0].getDeclaredFields()).length;
  52.  
  53. for (int var4 = 0; var4 < var5; ++var4) {
  54. Field e = var6[var4];
  55. if (!e.getType().isAssignableFrom(ArrayList.class)) {
  56. Method var20 = responses[0].getMethod(ReflectUtil.setterNameFromField(e), new Class[]{e.getType()});
  57. var20.invoke(obj, new Object[]{json.get(e.getName())});
  58. } else {
  59. JSONArray m = json.getJSONArray(e.getName());
  60. Object[] objects = (Object[]) Array.newInstance(responses[1], m.length());
  61.  
  62. for (int list = 0; list < objects.length; ++list) {
  63. objects[list] = jsonParseResponse(m.getJSONObject(list), (Class[]) Arrays.copyOfRange(responses, 1, responses.length));
  64. }
  65.  
  66. List var21 = asList(objects);
  67. Method m1 = responses[0].getMethod(ReflectUtil.setterNameFromField(e), new Class[]{var21.getClass()});
  68. m1.invoke(obj, new Object[]{var21});
  69. }
  70. }
  71. } catch (InstantiationException var14) {
  72. var14.printStackTrace();
  73. } catch (IllegalAccessException var15) {
  74. var15.printStackTrace();
  75. } catch (JSONException var16) {
  76. var16.printStackTrace();
  77. } catch (NoSuchMethodException var17) {
  78. var17.printStackTrace();
  79. } catch (IllegalArgumentException var18) {
  80. var18.printStackTrace();
  81. } catch (InvocationTargetException var19) {
  82. var19.printStackTrace();
  83. }
  84. } else {
  85. try {
  86. obj = objectMapper.readValue(json.toString(), responses[0]);
  87. } catch (JsonParseException var11) {
  88. var11.printStackTrace();
  89. } catch (JsonMappingException var12) {
  90. var12.printStackTrace();
  91. } catch (IOException var13) {
  92. var13.printStackTrace();
  93. }
  94. }
  95.  
  96. return obj;
  97. }
  98.  
  99. public static <T> List<T> asList(T... a) {
  100. ArrayList list = new ArrayList();
  101. Collections.addAll(list, a);
  102. return list;
  103. }
  104. }

第四步创建:HttpStringResponseHandler

  1. import android.content.Context;
  2.  
  3. import com.google.gson.Gson;
  4. import com.lzy.okgo.callback.StringCallback;
  5. import com.lzy.okgo.model.Response;
  6. import com.lzy.okgo.request.base.Request;
  7. import com.shiwen.oil.util.GsonUtil;
  8. import com.shiwen.oil.util.LoggerUtil;
  9. import com.shiwen.oil.widget.ProgressDialog;
  10. /**
  11. * 网络请求返回处理类
  12. */
  13. public abstract class HttpStringResponseHandler<T> extends StringCallback {
  14. private static final String TAG = "HttpStringResponseHandler";
  15. private Context context;
  16. private Class<T> cls;
  17. private boolean isNeedParse;
  18. private boolean isNeedProgress;
  19. /**
  20. * 不需要解析时使用
  21. *
  22. * @param context
  23. * @param isNeedProgress
  24. */
  25. public HttpStringResponseHandler(Context context, boolean isNeedProgress) {
  26. this.context = context;
  27. this.isNeedProgress = isNeedProgress;
  28. }
  29.  
  30. /**
  31. * 需要解析时,使用
  32. *
  33. * @param context
  34. * @param cls
  35. * @param isNeedParse
  36. * @param isNeedProgress
  37. */
  38. public HttpStringResponseHandler(Context context, Class<T> cls, boolean isNeedParse, boolean isNeedProgress) {
  39. this.context = context;
  40. this.cls = cls;
  41. this.isNeedParse = isNeedParse;
  42. this.isNeedProgress = isNeedProgress;
  43. }
  44. @Override
  45. public void onStart(Request<String, ? extends Request> request) {
  46. if (isNeedProgress && context != null)
  47. ProgressDialog.getInstance().startProgressDialog(context, "加载中");
  48. }
  49.  
  50. @Override
  51. public void onFinish() {
  52. if (isNeedProgress)
  53. ProgressDialog.getInstance().stopProgressDialog();
  54. }
  55. @Override
  56. public void onError(Response<String> response) {
  57. LoggerUtil.e("网络访问异常,请检查网络!" + response.toString());
  58. onFaile("网络访问异常,请检查网络!");
  59. if (isNeedProgress)
  60. ProgressDialog.getInstance().stopProgressDialog();
  61. }
  62.  
  63. @Override
  64. public void onSuccess(/*String response, int id*/Response<String> response) {
  65. LoggerUtil.e("onResponse = " + response.body());
  66. if (isNeedProgress)
  67. ProgressDialog.getInstance().stopProgressDialog();
  68.  
  69. if (isNeedParse) {
  70. try {
  71.  
  72. Gson gson = GsonUtil.getInstance();
  73. T result = gson.fromJson(response.body().trim(), cls);
  74. onSuccess(result);
  75. } catch (Exception e) {
  76. onFaile("数据错误!");
  77. LoggerUtil.e("onSuccess Exception : " + e.toString() + " ");
  78. e.printStackTrace();
  79. }
  80.  
  81. } else {
  82. onSuccessWithNoparse(response.body());
  83. }
  84. }
  85.  
  86. /**
  87. * 需要解析时的回调
  88. *
  89. * @param t
  90. */
  91. public void onSuccess(T t) {
  92. LoggerUtil.systemOut(t.toString());
  93. }
  94.  
  95. /**
  96. * 不需要解析时的回调
  97. *
  98. * @param result
  99. */
  100. public void onSuccessWithNoparse(String result) {
  101. }
  102.  
  103. /**
  104. * 失败的回调
  105. *
  106. * @param res
  107. */
  108. public void onFaile(String res) {
  109. LoggerUtil.systemOut("http onFaile ---> "+res);
  110. }
  111. }

第五步,代码中使用:

  1. private void getDailyDatefromNet() {
  2. refreshLayout.setRefreshing(true);
  3. String ksrq = tvDate.getText().toString().trim();
  4. HttpManager.getInstance(getActivity()).getDialyData(ksrq, new HttpStringResponseHandler<DailyDataResult>(getActivity(), DailyDataResult.class, true, false) {
  5. @Override
  6. public void onSuccess(DailyDataResult dailyDataResult) {
  7.  
  8. super.onSuccess(dailyDataResult);
  9.  
  10. }
  11.  
  12. @Override
  13. public void onFaile(String res) {
  14. super.onFaile(res);
  15.  
  16. }
  17.  
  18. @Override
  19. public void onError(Response<String> response) {
  20. super.onError(response);
  21.  
  22. }
  23. });
  24. }

示例2:图片上传:

  1. HttpManager.getInstance(DataActivity.this).loanImg(new File(cropImagePath), LoanDataStep1Activity.this, new HttpStringResponseHandler<LoanImgResult>(LoanDataStep1Activity.this, LoanImgResult.class, true, true) {
  2. @Override
  3. public void onSuccess(final LoanImgResult response) {
  4. super.onSuccess(response);
  5.  
  6. }
  7. });

文件下载OkDownload

OkGo与OkDownload的区别就是,OkGo只是简单的做一个下载功能,不具备断点下载,暂停等操作,但是这在很多时候已经能满足需要了。
而有些app需要有一个下载列表的功能,就像迅雷下载一样,每个下载任务可以暂停,可以继续,可以重新下载,可以有下载优先级,这时候OkDownload就有用了。

  • 结合OkGo的request进行网络请求,支持与OkGo保持相同的配置方法和传参方式
  • 支持断点下载,支持突然断网,强杀进程后,继续断点下载
  • 每个下载任务具有无状态、下载、暂停、等待、出错、完成共六种状态
  • 所有下载任务按照tag区分,切记不同的任务必须使用不一样的tag,否者断点会发生错乱
  • 相同的下载url地址,如果使用不一样的tag,也会认为是两个下载任务
  • 不同的下载url地址,如果使用相同的tag,会认为是同一个任务,导致断点错乱
  • 默认同时下载数量为3个,默认下载路径/storage/emulated/0/download,下载路径和下载数量都可以在代码中配置
  • 下载文件名可以自己定义,也可以不传,让框架自动获取文件名

简单实现代码:

  1. HttpManager.getInstance(this).downloadFile(new DownloadListener("tasgTag") {
  2. @Override
  3. public void onStart(Progress progress) {
  4. LoggerUtil.systemOut(progress+"progress");
  5. }
  6.  
  7. @Override
  8. public void onProgress(Progress progress) {
  9. LoggerUtil.systemOut(progress+"progress");
  10. }
  11.  
  12. @Override
  13. public void onError(Progress progress) {
  14. LoggerUtil.systemOut(progress+"progress");
  15. }
  16.  
  17. @Override
  18. public void onFinish(File file, Progress progress) {
  19. LoggerUtil.systemOut(progress+"progress");
  20. }
  21.  
  22. @Override
  23. public void onRemove(Progress progress) {
  24. LoggerUtil.systemOut(progress+"progress");
  25. }
  26. });
  1. /**
  2. * 下载
  3. *
  4. * @param
  5. */
  6. public void downloadFile(DownloadListener downloadListener) {
  7.  
  8. Request<File, ? extends Request> request = OkGo.<File>get("http://192.168.0.195:8088/test.apk");
  9. OkDownload.getInstance().request("tasgTag", request)
  10. .fileName("test.apk")
  11. .folder(CommonConstants.appDir.getPath())
  12. .save()
  13. .register(downloadListener)
  14. .start();
  15. }
  1. 构建一个下载请求Request,这个构建方法和OkGo是一样的,params参数和headers参数是只是演示使用,一切OkGo的使用方法,这里都是一样的。
  2. 构建下载任务,使用OkDownload中的request方法,传入一个tag和我们上一步创建的request对象,创建出下载任务,其他的方法我们下文在细讲。
  3. 启动任务,我们已经得到了DownloadTask任务对象,那么简单调用start启动他就好了,同时他还支持这么几个方法:
    • start():开始一个新任务,或者继续下载暂停的任务都是这个方法
    • pause():将一个下载中的任务暂停
    • remove():移除一个任务,无论这个任务是在下载中、暂停、完成还是其他任何状态,都可以直接移除这个任务,他有一个重载方法,接受一个boolen参数,true表示删除任务的时候同时删除文件,false表示只删除任务,但是文件保留在手机上。不传的话,默认为false,即不删除文件。
    • restart():重新下载一个任务。重新下载会先删除以前的任务,同时也会删除文件,然后从头开始重新下载该文件。

Request的构建详细参考OkGo的用法,这里重点介绍DownloadTask的构建,这里面的方法一个个介绍:

  1. request():静态方法创建DownloadTask对象,接受两个参数,第一个参数是tag,表示当前任务的唯一标识,就像介绍中说的,所有下载任务按照tag区分,不同的任务必须使用不一样的tag,否者断点会发生错乱,如果相同的下载url地址,如果使用不一样的tag,也会认为是两个下载任务,不同的下载url地址,如果使用相同的tag,也会认为是同一个任务,导致断点错乱。切记,切记!!
  2. priority():表示当前任务的下载优先级,他是一个int类型的值,只要在int的大小范围内,数值越大,优先级越高,也就会优先下载。当然也可以不设置,默认优先级为0,当所有任务优先级都一样的时候,就会按添加顺序下载。
  3. floder():单独指定当前下载任务的文件夹目录,如果你是6.0以上的系统,记得下载的时候先自己获取sd卡的运行时权限,否则文件夹创建不成功,无法下载。当然也可以不指定,默认下载路径/storage/emulated/0/download
  4. fileName():手动指定下载的文件名,一般来说是不需要手动指定的,也建议不要自己指定,除非你明确知道你要下载的是什么,或者你想改成你自己的文件名。如果不指定,文件名将按照以下规则自动获取,获取规则与OkGo文件下载获取规则一致,点击这里查看
  5. extra():这个方法相当于数据库的扩展字段,我们知道我们断点下载是需要保存下载进度信息的,而我们这个框架是保存在数据库中,数据库的字段都是写死的,如果用户想在我们的下载数据库中保存自己的数据就做不到了,所以我们这里提供了三个扩展字段,允许用户保存自己想要的数据,如果不需要的话,也不用调用该方法。
  6. register():这是个注册监听的方法,我们既然要下载文件,那么我们肯定要知道下载的进度和状态是吧,就在这里注册我们需要的监听,监听可以注册多个,同时生效,当状态发生改变的时候,每个监听都会收到通知。当然如果你只是想下载一个文件,不关心他的回调,那么你不用注册任何回调。

okgo网络请求框架的实现的更多相关文章

  1. Android网络请求框架

    本篇主要介绍一下Android中经常用到的网络请求框架: 客户端网络请求,就是客户端发起网络请求,经过网络框架的特殊处理,让后将请求发送的服务器,服务器根据 请求的参数,返回客户端需要的数据,经过网络 ...

  2. Android 网络请求框架android-async-http问题

    今天通过接口请求服务器的一些app数据,发现一个很奇怪的问题,请求一个链接的时候,通常在第一次请求发起的时候没有什么问题,能很快的拿到数据,但是 往后再去请求的时候就会等待很久,而且最后会请求失败,一 ...

  3. 基于Retrofit+RxJava的Android分层网络请求框架

    目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...

  4. Volley网络请求框架的基本用法

    备注: 本笔记是参照了 http://blog.csdn.net/ysh06201418/article/details/46443235  学习之后写下的 简介:  Volley是google官网退 ...

  5. Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

    最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...

  6. App 组件化/模块化之路——如何封装网络请求框架

    App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...

  7. 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了

    在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装.添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对Da ...

  8. C#反射の一个泛型反射实现的网络请求框架

    点击下载源码 C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转)

  9. XDroidRequest网络请求框架,新开源

    XDroidRequest 是一款网络请求框架,它的功能也许会适合你.这是本项目的第三版了,前两版由于扩展性问题一直不满意,思考来 思考去还是觉得Google的Volley的扩展性最强,于是借鉴了Vo ...

随机推荐

  1. 免费FQ工具

    这里使用免费的`梯子` 下载赛风 选择Windows下载 下载好之后,直接点击打开,它会自动连接,什么也不要设置,下载的就是一个exe文件,连接成功会打开一个网页,不用管

  2. xorm:golang的orm(只写了一小部分)

    xorm xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便.这个库是国人开发的,是基于原版 xorm:https://github.com/go-xorm/xorm 的定制 ...

  3. 隔离技术线程池(ThreadPool)和信号量(semaphore)

    一.首先要明白Semaphore和线程池各自是干什么? 信号量Semaphore是一个并发工具类,用来控制可同时并发的线程数,其内部维护了一组虚拟许可,通过构造器指定许可的数量,每次线程执行操作时先通 ...

  4. Stopwatch简单时间检测

    public ActionResult Index() { Stopwatch sw = new Stopwatch(); //实例化一个对象 sw.Start(); //开始计算 int[] a = ...

  5. C语言结构体初始化的四种方法

    定义 struct InitMember{    int first:    double second:    char* third:    float four;}; 方法一:定义时赋值 str ...

  6. 多对多第三张表的创建方式 和 forms组件的使用

    目录 一.多对多第三张表的创建 1. 全自动方式 (1)实现代码 (2)优点和不足 2. 纯手撸方式(了解) (1)实现代码 (2)优点和不足 3. 半自动方式(推荐使用) (1)实现代码 (2)优点 ...

  7. Acwing-119-袭击(分治)

    链接: https://www.acwing.com/problem/content/121/ 题意: 在与联盟的战斗中屡战屡败后,帝国撤退到了最后一个据点. 依靠其强大的防御系统,帝国击退了联盟的六 ...

  8. Acwing-98-分形之城(递推,数学)

    链接: https://www.acwing.com/problem/content/description/100/ 题意: 城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并 ...

  9. Java枚举类的7种常用的方法

    转载于:https://www.cnblogs.com/xhlwjy/p/11314368.html

  10. POJ 3068 运送危险化学品 最小费用流 模板题

    "Shortest" pair of paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1215 ...