美文网首页安卓开发博客
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