Android开发,ZxMvp框架的引入及使用详解(中)
来源:互联网 发布:数据分析师的发展趋势 编辑:程序博客网 时间:2024/06/05 18:15
上一章:Android开发,ZxMvp框架的引入及使用详解(上)
我们讲了怎样添加zxmvp框架进项目,这一章我们开始进行使用。
1.这几个类的用处
我们依次打开ForgetActivity、ForgetModel、FoegetPresenter、FoegetContract这四个文件
FoegetActivity:
public class ForgetActivity extends BaseActivity<ForgetPresenter, ForgetModel> implements ForgetContract.View { @BindView(R.id.forget_return) ImageView forgetReturn; @BindView(R.id.back_phone) EditText backPhone; @BindView(R.id.back_bt) Button backBt; @BindView(R.id.back_code) EditText backCode; @BindView(R.id.btn_next) Button btnNext; public static void startAction(Activity activity, boolean isFinish) { Intent intent = new Intent(activity, ForgetActivity.class); activity.startActivity(intent); if (isFinish) activity.finish(); } @Override public int getLayoutId() { return R.layout.activity_forget; } @OnClick({R.id.back_bt, R.id.btn_next}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.back_bt: break; case R.id.btn_next: break; } } @Override public void initView() { }}如上 我们可以看到,有几个方法,startAction、getlayoutId、onViewClicked、initeview
startAction是用于别的activty跳转到该类的方法,这样写的好处是便于修改。
getLayoutId是用于返回activity所在类的xml
onViewClicked是用于设置点击事件的,本套框架使用的是ButterKnife依赖注入,使用方法如上。
initView初始化,该方法是在oncraete中执行的,大家可以把它当做oncreate看待。
ForgetModel
public class ForgetModel extends BaseModel implements ForgetContract.Model {}这个类是用于数据请求和数据处理的。
ForgetPresenter
public class ForgetPresenter extends ForgetContract.Presenter {}这个类是用于存放方法的,比如开始进行网络请求。
ForgetContract
public interface ForgetContract { //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息 interface View extends IView { } //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存 interface Model extends IModel { } //方法 abstract class Presenter extends BasePresenter<View, Model> { }}该类是整套框架的逻辑中枢,所有的逻辑都是从这里发散出去,一个功能的实现,只要写好了Constart,你就已经完成了一半了。
下面我们开始进行开发。
比如我们要开发忘记密码界面,我们需要进行两次网络请求,一次是请求发送验证码,第二次是验证验证码是否正确。
2.书写ForgetContract
根据需求,我们知道了我们需要我们两个功能。
先看ForgetContract中的View接口,这个接口是用于对activity进行回调,我们知道,两个功能,我们要回调两次,分别告诉activity,验证码已经发送成功了,验证码已经验证成功了,并且把相应的实体类返回回去。
interface View extends IView { void onSendCodeResult(); void onCheckCodeResult(CodeEntity codeEntity); }
接下来我们继续写Model接口,这个接口是用于根据接口创建相关的网络请求。很明显这里需要两个网络请求。
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存 interface Model extends IModel { Observable<String> sendCodeData(Map<String, String> map); Observable<CodeEntity> checkCodeData(Map<String, String> map); }如上所示,我们分别告诉了框架,我们需要进行发送验证码,我会给你一个map的数据集,你要返回给我一个字符串类型的参数给我
和我们需要验证验证码是否正确,我也给你一个map的数据集,你要返回给我一个CodeEntity的实体类给我。
最后我们写Presenter这个抽象方法。这个就是我们的presenter中需要实现的方法。
//方法 abstract class Presenter extends BasePresenter<View, Model> { public abstract void doSendCode(Map<String, String> map); public abstract void doCheckCode(Map<String, String> map); }也是两个,一个开始发送验证码,一个开始检测验证码,都会给他一个map的数据集。这个数据集就是我们的网络请求需要传的参数集合。
3.书写FoegetModel
事实上,只要上一个ForgetContract写完了之后,剩下的工作就已经变得很轻松了,我们打开ForgetModel,实现两个我们在Contract中的方法。public class ForgetModel extends BaseModel implements ForgetContract.Model { @Override public Observable<String> sendCodeData(Map<String, String> map) { return mRepositoryManager.obtainRetrofitService(ApiService.class) //寻求请求文件 .sendCode(map)//传入的map //.compose(RxHelper.handleResult())//rxhelper处理返回结果,就是指的,帮你把返回结果自动处理成实体类的意思 .compose(RxSchedulers.io_main());//第四排代表绑定线程 这个你不用管; } @Override public Observable<CodeEntity> checkCodeData(Map<String, String> map) { return mRepositoryManager.obtainRetrofitService(ApiService.class) //寻求请求文件 .checkCode(map)//传入的map .compose(RxHelper.handleResult())//rxhelper处理返回结果,就是指的,帮你把返回结果自动处理成实体类的意思 .compose(RxSchedulers.io_main());//第四排代表绑定线程 这个你不用管; }}我们可以发现这两个接口的实现方式是一模一样的,第一排我们需要找到一个ApiService.class文件,这个文件里面存放着我们的接口。如下:
public interface ApiService { @POST("mobile/sendCode") Observable<String> sendCode(@QueryMap Map<String, String> map); @POST("") Observable<BaseRespose<CodeEntity>> checkCode(@QueryMap Map<String, String> map);}如上所示,我们这里有两个接口,这里的@POST是请求类型,可以换成GET,POST后面跟着的就是接口地址,注意的是,这里的接口地址,并不是全地址,而是用我们在ApiConstants里面的RELEASE_URL和后面的地址拼装完成
public class ApiConstants { //测试地址: http://47.93.44.161:80/shop // 正式地址: www.htxysc.com:8080/shop public static boolean ISRELEASE = false;// 是否正式环境 public static final String RELEASE_URL = ISRELEASE ? "http://www.baidu.com/" : "http://www.baidu.com/"; //必须以http://开头,且结尾必须为反斜线/}这里的RELEASE_URL就是我们的baseurl,这个地址是我们所有接口的前缀地址,这个地址的使用,我们放在了GloabalConfigutation之中。
这个文件我这里就不细讲了,他就是用来配置全局信息的,我们把baseurl已经在这里设置给他了。同时你可以在这里做其他操作,比如添加请求头,等等,详细的说明我都注释在上面了。
回到ForgetModel,第一排代表了找到借口请求文件,第二排调用相关的接口,第三排代表使用RxHelper进行数据处理,第四排代表了绑定到主线程。
前两个不难理解,第四个,绑定线程就是绑定到主线程,当前activity退出的时候,会自动结束还在进行的网络请求。
我们主要说说第三个。
compose(RxHelper.handleResult())这个方法,这个方法,只有在我们使用了BaseResponse的时候才用得到,
public class BaseRespose<T> implements Serializable { public String success; public String msg; public T obj; public boolean success() { return "1".equals(success); } @Override public String toString() { return "BaseRespose{" + "success='" + success + '\'' + ", msg='" + msg + '\'' + ", obj=" + obj + '}'; }}BaseResponse的作用,相信大家能看的清楚,就是封装了所有的返回结果,将状态码和消息提取出来,将具体的obj封装成一个泛型的实体。
如果使用了BaseResponse+RxHelper,我们就必须保证,那个接口的返回值必须是这种格式
{success:1, msg:ok, obj:{.......}}当然,具体的命名 你们是可以自由修改的,修改成你们项目的接口规范。
可以看到这个位置,我发送验证码的接口,没有使用BaseResponse来进行包装,那么在我们的ForgetModel里面,我们就不能使用RxHelper来帮助我们处理参数
至于其中的区别,待会在我们写ForgetPresenter的时候,就会发现了,还不明白的大家,可以先等一下。
下一章:Android开发,ZxMvp框架的引入及使用详解(下)
阅读全文
0 0
- Android开发,ZxMvp框架的引入及使用详解(中)
- Android开发,ZxMvp框架的引入及使用详解(上)
- Android开发,ZxMvp框架的引入及使用详解(下)
- Android开发框架及注解的使用
- Android引入即用的便捷开发框架WelikeAndroid
- Android引入即用的便捷开发框架WelikeAndroid
- Android ButterKnife依赖注入框架的引入和使用
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 最火的快速开发框架AndroidAnnotations使用详解
- Android 快速开发框架AndroidAnnotations使用详解
- page指令中contentType属性和pageEncoding的作用和区别
- 20170904-20170910C#工作学习周总结
- 数码相机成像原理
- 实验三:单链表及其操作
- UVA 673 Parentheses Balance
- Android开发,ZxMvp框架的引入及使用详解(中)
- 本地计算机上的OracleOraDb10g_home1TNSListener服务启动后又停止---解决方法
- 机器学习第一周总结——线性回归
- Android EditText 使用时遇到 StackOverflowError
- mysql基本操作(php版内容整理)
- new、this、static、
- ORA-00600: 内部错误代码
- java读取mysql形如‘0000-00-00’时间出现异常问题
- 深圳物业调查:江苏物业第三方评估可防“自说自话”