欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-09 18:05:03
okhttputils网络请求为什么进行二次封装? 1、减少代码量 2、后期换网络处理框架方便 二次封装的实现原理 1、将网络请求提取在一个方法中 2、对里面...

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);
 }
}

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