美文网首页安卓开发博客
Android快速开发架构PlanA(四),网络请求篇,划重点(

Android快速开发架构PlanA(四),网络请求篇,划重点(

作者: Alt丶 | 来源:发表于2018-07-12 12:48 被阅读36次

Android快速开发架构PlanA,一周一个APP,持续维护中!
Android快速开发架构PlanA(一),船新版本的BaseActivity
Android快速开发架构PlanA(二),简单粗暴的路由管理PRouter
Android快速开发架构PlanA(三),你一定会用上的工具类
Android快速开发架构PlanA(四),网络请求篇,划重点(必考)
Android快速开发架构PlanA(五),文件上传下载了解一下
Android快速开发架构PlanA(六),抱歉,这些自定义控件真的可以让你为所欲为
Android快速开发架构PlanA(七),隐藏技能:PhotoBrowse图片浏览

1.怎么说?

  PlanA架构集成第四篇,PlanA中网络请求的使用,相信很多开发者在Android的开发中都有自己的网络请求体系,更适合自己,这里的网络请求方面也做了高度封装,针对多种情况,可以选择使用,使用简单,方便。
  PlanA中的网络请求主要是Retrofit2+Okhttp3+Rxjava2的封装,不需要了解底层的实现思路,你只需两行代码即可实现高效,快速的网络请求。

2.初始化

  • 在Application的onCreate中初始化BASE_URL
RetrofitClient.initBaseUrl(BASE_URL);

3.发起请求

GET请求(doGet:Data模型解析返回,executeGet:原始数据返回)

  • 无参,无requestCode

    RetrofitClient.getInstance().doGet(url,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,iBaseBiz,iCommonHttpCallback);
    
  • 有参,无requestCode

    RetrofitClient.getInstance().doGet(url,params,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,params,iBaseBiz,iCommonHttpCallback);
    
  • 无参,有requestCode

    RetrofitClient.getInstance().doGet(url,requestCode,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,requestCode,iBaseBiz,iCommonHttpCallback);
    
  • 有参,有requestCode

    RetrofitClient.getInstance().doGet(url,requestCode, params,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,requestCode, params,iBaseBiz,iCommonHttpCallback);
    

POST请求(与上面Get一致,根据自己的数据返回需要二选一)

  • 无参,无requestCode

    RetrofitClient.getInstance().doPost(url,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,iBaseBiz,iCommonHttpCallback);
    
  • 有参,无requestCode

    RetrofitClient.getInstance().doPost(url,params,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,params,iBaseBiz,iCommonHttpCallback);
    
  • 无参,有requestCode

    RetrofitClient.getInstance().doPost(url,requestCode,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,requestCode,iBaseBiz,iCommonHttpCallback);
    
  • 有参,有requestCode

    RetrofitClient.getInstance().doPost(url,requestCode,params,iBaseBiz,iCommonHttpCallback);
    RetrofitClient.getInstance().executeGet(url,requestCode,params,iBaseBiz,iCommonHttpCallback);
    

取消网络请求

 //taskId 为网络请求任务Id,例如:String taskId = RetrofitClient.getInstance().doGet(url,iBaseBiz,iCommonHttpCallback);
 RetrofitClient.getInstance().cancelRequest(taskId);

会不会有点懵?别急,下面有代码demo哈,滑下去嘛!

参数说明

  • url:接口的相对地址,如:"api/user/loginAction"

  • requestCode:请求码,主要用于多个请求并行的时候,在请求成功回调接口里面区分请求对应的响应

  • params:请求参数,如下详细实例:

     RequestParams.getInstance().addParam(key,value).addParam(key,value)...;//链式添加参数
    
     RequestParams.paramMap //参数的map对象,即上面的params
    
     demo:添加参数为id=1,name=Kevin
    
           RequestParams.getInstance().addParam("id",1).addParam("name","Kevin");
    
           RequestParams.paramMap //这个对象返回的就是id=1,name=Kevin的map对象
    
  • IBaseBiz:业务接口基类(MVP常规业务接口模式),如下详细实例:

    • 建议新建一个IMyBaseBiz来继承IBaseBiz,这样就可以在你新建的业务接口中实现你想要的更多方法了

    • IBaseBiz 用到网络请求的地方就可以在Activity里实现,主要有以下两个实现方法

      getActivity() 获取Activity对象
      
      toActivity() 跳到UI执行的方法
      
  • ICommonHttpCallback:请求回调接口,如下详细实例:

     onResponse(requestCode,data); //请求成功,返回请求的数据
    
     onSuccess(requestCode,data); 回调正确状态的data数据 status:1
    
     onException(requestCode,data); 回调异常状态data数据 status!=1
    
     onError(requestCode,e); 回调错误方法,诸如404,500,timeout等
    
     requestCode 为请求码,主要用于多个请求并行的时候,在请求成功回调接口里面区分请求对应的响应
    
     data 请求返回的数据
    
     e 请求失败的Throwable
    

请求数据返回实例

  • Data / ResponseBody 请求成功返回类型

    Data:doGet()或者doPost()请求所返回的数据解析模型
    
    {
        status : 1,
        message : "请求成功",
        data : Object
    }
    
    ResponseBody : executeGet()或者executePost()请求所返回的数据,在ononResponse()回调方法中将会直接返回请求响应的字符串数据
    

4.请求实例demo

  • 屌丝版

      public class HttpDemoActivity extends BaseActivity implements IBaseBiz,ICommonHttpCallback{
    
          @Override
          public int getContentViewResId() {
              return R.layout.activity_http_demo;
          }
    
          @Override
          public void init(Bundle savedInstanceState) {
              showDialog();//网络请求的时候开启菊花弹窗 QAQ
              RequestParams.getInstance().addParam("token", "827ccb0eea8a706c4c34a16891f84e7b");
              RetrofitClient.getInstance().doPost("api/configure/findUser",RequestParams.paramMap, this, this);
          }
    
          @Override
          public Activity getActivity() {
              return this;
          }
    
          @Override
          public void toActivity() {
      
          }
    
          @Override
          public void onResponse(int requestCode, Object data) {
              closeDialog();//关闭菊花弹窗 QAQ
              LogUtils.d("返回的原始数据为:"+data);
          }
    
          @Override
          public void onSuccess(int requestCode, Object data) {
              closeDialog();//关闭菊花弹窗 QAQ
              LogUtils.d("Data返回模型已解析且status为1时候返回的数据:"+data);
          }
    
          @Override
          public void onException(int requestCode, Object data) {
              closeDialog();//关闭菊花弹窗 QAQ
              LogUtils.d("返回的异常数据(Data返回模型已解析且status!=1):"+data);
          }
    
          @Override
          public void onError(int requestCode, Throwable e) {
              closeDialog();//关闭菊花弹窗 QAQ
              LogUtils.d("返回错误:"+e.getLocalizedMessage());
          }
      }
    
  • 土豪版

    • 就用简单的MVP举个栗子,MVVM同理


      网络请求.png
    • 类结构


      MVP用到的类.png
    • HttpDemoActivity

      public class HttpDemoActivity extends BaseActivity implements IHttpDemoBiz{
          private Button requestBtn;
          private TextView nameTv;
          private HttpDemoPresenter presenter;
          @Override
          public int getContentViewResId() {
              return R.layout.activity_http_demo;
          }
      
          @Override
          public void init(Bundle savedInstanceState) {
              setTitle("网络请求实例");
              requestBtn = findViewById(R.id.requestBtn);
              nameTv = findViewById(R.id.nameTv);
              presenter = new HttpDemoPresenter(this);
              requestBtn.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      presenter.doRequest();
                  }
              });
          }
      
          @Override
          public Activity getActivity() {
              return this;
          }
      
          @Override
          public void toActivity() { }
      
          @Override
          public void refreshUIData(String name) {
              //刷新UI视图
              nameTv.setText("请求后:"+name);
          }
      }
      
    • IHttpDemoBiz

       public interface IHttpDemoBiz extends IBaseBiz {
           void refreshUIData(String name);
       }
      
    • HttpDemoPresenter

       public class HttpDemoPresenter extends CommonRequestCallback{
           private IHttpDemoBiz iHttpDemoBiz;
           public HttpDemoPresenter(IHttpDemoBiz iHttpDemoBiz) {
               super(iHttpDemoBiz.getActivity());
               this.iHttpDemoBiz = iHttpDemoBiz;
           }
      
           public void doRequest(){
             RequestParams.getInstance().addParam("token", "827ccb0eea8a706c4c34a16891f84e7b");
             RetrofitClient.getInstance().doPost("api/configure/findUser",RequestParams.paramMap, iHttpDemoBiz, this);
           }
      
           @Override
           public void onSuccess(int i, Object o) {
             super.onSuccess(i, o);
             //这里是请求成功并且status为1的时候返回的data数据 data数据为Data实体中的data泛型
             iHttpDemoBiz.refreshUIData(o.toString());
           }
       }
      
    • CommonRequestCallback

      public class CommonRequestCallback implements ICommonHttpCallback {
          private Context context;
      
          public CommonRequestCallback(Context context) {
              this.context = context;
          }
      
          @Override
          public void onResponse(int i, Object o) { }
      
          @Override
          public void onSuccess(int i, Object o) { }
      
          @Override
          public void onException(int i, Object o) {
              Data data = (Data)o;
              ToastUtils.showShort(context,data.getMessage());
              if(data.getStatus() == -1){//身份过期
                  ActivityStack.getInstance().clearAllActivity();
                  PRouter.getInstance().navigation(context, LoginActivity.class);
              }
          }
      
          @Override
          public void onError(int i, Throwable throwable) { }
      }
      

重要说明:doGet()和doPost()方法进行网络请求时,请求成功会回调onResponse()和onSuccess(),这是因为回调数据解析是采用的Data标准返回模型来做的解析,拦截了异常返回数据,那么executeGet()和executePost()方法的请求回调则只有onResponse()了,请求到了什么就返回什么数据,即原始数据返回。

重要的事再说一遍,要根据服务器返回的数据格式来调不同的请求方法(doXxx或executeXxx),不然会出现数据解析错误哦(即不规则返回数据按照Data模型解析报错)。

PlanA网络请求框架持续优化中,有疑问或者改进意见请留言↓↓↓

相关文章

网友评论

本文标题:Android快速开发架构PlanA(四),网络请求篇,划重点(

本文链接:https://www.haomeiwen.com/subject/jmnvuftx.html