Android基于OkHttpUtils网络请求的二次封装

发布时间 - 2026-01-10 23:25:50    点击率:

OkHttpUtils网络请求为什么进行二次封装

1、减少代码量
2、后期换网络处理框架方便

二次封装的实现原理

1、将网络请求提取在一个方法中
2、对里面的可变参数,可以通过参数传递过去,也可以提供一个set方法传递过去
3、对于请求失败和成功,我们可以使用接口回调,让调用该方法的对象处理

封装后的网络处理类的功能

1、网络请求
2、xml数据转换成javaBean

每一个处理网络请求的ListView都要处理的3数据方法

1、初始化数据
2、下拉刷新数据
3、上拉加载数据

封装前的代码

 /**
  * 3,加载更多
  * 注意事项:
  * 请求成功数据更新之后,要关闭SpringView
  */
 private void onDealLoadmore() {
  //资讯的网络请求地址
  String newsUrl = Constant.NEWS_URL;
  //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20
  //关闭SpringView
  mSpringView.onFinishFreshAndLoad();
  //网络请求
  OkHttpUtils
    .get()
    .url(newsUrl)
    .addParams("pageIndex", mCurrentPageIndex + "")//固定
    .addParams("catalog", "1")//固定,1代表资讯
    .addParams("pageSize", "20")//因为,一页加载20条数据
    .build()
    .execute(new StringCallback() {
     @Override
     public void onError(Call call, Exception e, int id) {
      Toast.makeText(mContext, "上拉加载失败", Toast.LENGTH_SHORT).show();
      /* //关闭SpringView
      mSpringView.onFinishFreshAndLoad();*/
     }

     @Override
     public void onResponse(String response, int id) {
      //请求成功,将字符串转为javaBean,并获取里面的泛型为News的集合
      NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
      //对请求的数据进行非空判断
      if (newsList != null) {
       List<News> list = newsList.getList();
       if (list != null && list.size() > 0) {
        //数据的更新
        mData.addAll(newsList.getList());
        //适配器的更新
        mMyNewsPagerAdapter.notifyDataSetChanged();
        //请求页的索引要加1
        ++mCurrentPageIndex;
        /* //关闭SpringView
        mSpringView.onFinishFreshAndLoad();*/

       }
      }
     }
    });

 }

封装后的代码

/**
  * 3,加载更多
  * 注意事项:
  * 请求成功数据更新之后,要关闭SpringView
  */
 private void onDealLoadmore() {
  mSpringView.onFinishFreshAndLoad();
  mNewsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
  mNewsPagerProtocol.loadData(new NewsPagerProtocol.Callback() {
   @Override
   public void onError(Call call, Exception e, int id) {
    Toast.makeText(mContext, "下拉刷新失败", Toast.LENGTH_SHORT).show();
   }

   @Override
   public void onResponse(NewsList newsList, int id) {

    if (newsList != null) {


     //获取刷新的数据集合
     List<News> list = newsList.getList();
     //健壮性判断
     if (list != null && list.size() > 0) {
      //更新数据集合
      mData.addAll(list);
      //更新适配器
      mMyNewsPagerAdapter.notifyDataSetChanged();
      //更新页数的索引值
      mCurrentPageIndex ++ ;
     }
    }

   }
  });

 }

网络封装的代码

/**
 * Author:  归零
 * Date:  2017/3/4 1:08
 * Email:  4994766@qq.com
 * Description:网络请求和数据解析
 */
public class NewsPagerProtocol {


 private int mCurrentPageIndex;

 public void setCurrentPageIndex(int currentPageIndex) {

  mCurrentPageIndex = currentPageIndex;
 }


 public void loadData(final Callback callback) {
  //资讯的网络请求地址
  String newsUrl = Constant.NEWS_URL;
  //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20
  //网络请求
  OkHttpUtils
    .get()
    .url(newsUrl)
    .addParams("pageIndex", mCurrentPageIndex + "")//固定
    .addParams("catalog", "1")//固定,1代表资讯
    .addParams("pageSize", "20")//因为,一页加载20条数据
    .build()
    .execute(new StringCallback() {
     @Override
     public void onError(Call call, Exception e, int id) {
      //因为返回失败处理的请求不一样,所以不处理,交给调用的方法处理
      callback.onError(call, e, id);
     }

     @Override
     public void onResponse(String response, int id) {
      //请求成功,将字符串转为javaBean,并获取里面的泛型为News的集合
      NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
      //将转换后的数据通过接口回调,返回给调用方法的
      callback.onResponse(newsList, id);
     }
    });
 }


 public interface Callback {

  public void onError(Call call, Exception e, int id);

  public void onResponse(NewsList newsList, int id);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # OkHttpUtils  # 网络请求  # Android 网络请求框架解析之okhttp与okio  # Android OkHttp库简单使用和封装教程助你快速掌握网络请求技能  # 加载  # 回调  # 都要  # 可以通过  # 可以使用  # 提供一个  # 转换成  # 大家多多  # 后期  # 健壮性  # action  # net  # news_list  # api  # NEWS_URL  # Constant  # http  # oschina  # www  # pageIndex 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: bootstrap日历插件datetimepicker使用方法  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  动图在线制作网站有哪些,滑动动图图集怎么做?  如何在VPS电脑上快速搭建网站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  高防服务器如何保障网站安全无虞?  香港网站服务器数量如何影响SEO优化效果?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何快速查询域名建站关键信息?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel如何实现本地化和多语言支持?(i18n教程)  javascript基于原型链的继承及call和apply函数用法分析  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  IOS倒计时设置UIButton标题title的抖动问题  Windows Hello人脸识别突然无法使用  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  利用JavaScript实现拖拽改变元素大小  MySQL查询结果复制到新表的方法(更新、插入)  什么是javascript作用域_全局和局部作用域有什么区别?  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  香港服务器选型指南:免备案配置与高效建站方案解析  如何为不同团队 ID 动态生成多个非值班状态按钮  网站建设要注意的标准 促进网站用户好感度!  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何选择PHP开源工具快速搭建网站?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  免费视频制作网站,更新又快又好的免费电影网站?  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何创建自定义Artisan命令?(代码示例)  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何在Windows 2008云服务器安全搭建网站?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  iOS验证手机号的正则表达式  如何制作一个表白网站视频,关于勇敢表白的小标题?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何确保FTP站点访问权限与数据传输安全?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?