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

Android开发,ZxMvp框架的引入及使用详解(中)

程序员文章站 2022-05-14 10:03:22
...

上一章: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之中。
Android开发,ZxMvp框架的引入及使用详解(中)
这个文件我这里就不细讲了,他就是用来配置全局信息的,我们把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:{.......}}
当然,具体的命名  你们是可以*修改的,修改成你们项目的接口规范。
Android开发,ZxMvp框架的引入及使用详解(中)

可以看到这个位置,我发送验证码的接口,没有使用BaseResponse来进行包装,那么在我们的ForgetModel里面,我们就不能使用RxHelper来帮助我们处理参数
Android开发,ZxMvp框架的引入及使用详解(中)

至于其中的区别,待会在我们写ForgetPresenter的时候,就会发现了,还不明白的大家,可以先等一下。


下一章:Android开发,ZxMvp框架的引入及使用详解(下)