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网络请求框架持续优化中,有疑问或者改进意见请留言↓↓↓
网友评论