初识MVP,简单Demo

本文介绍了作者在开发新项目时尝试使用MVP模式,并创建了一个简单的手机号归属地查询Demo。Demo利用juhe免费接口,UI简洁,逻辑包括输入手机号,点击查询按钮,发送请求获取数据并显示结果。文章详细描述了MVP架构中Activity、Presenter、View接口和Model(使用Retrofit进行网络请求)的职责,强调了通过接口实现组件间的通信。
摘要由CSDN通过智能技术生成


      最近要开发个新项目,原公司好几个项目,老板说要合并在一个项目里;苦逼啊,原来的项目经过好几拨人下过手了,已经是烂坟岗了,不忍下眼了 啊。

就想着要不要搞个MVP,周末来个朋友,聊了一下,早上来公司撸了个demo,放在这做个笔记。

 

   下面直接上代码:(mvp模式,我就不作解释了,可以参考这个链接:http://kb.cnblogs.com/page/137392/)


   本Demo是查询手机号归属地,接口用的是juhe免费接口;

   效果就是这样,ui比较丑:

  


         Demo逻辑很简单,就是输入手机号查询手机的归属地和运营商,点击个Button 然后向服务器请求数据,拿到数据展示结果;

目录结构:


    

activity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mvp_demo);
    ButterKnife.bind(this);
    mDemoActivityP = new MvpDemoActivityP(this, this); 构造presenter对象
}

@OnClick(R.id.btn_search)
public void onViewClicked() {
    //TODO 查询
   doSearch();
}
/**
 * 开始查询
 */
private void doSearch() {
    String phone = demoTest.getText().toString();
    mDemoActivityP.commitPhone(phone, key);//Presenter与具体的View是没有直接关联的,
                                           //而是通过定义好的接口进行交互
}

/**
 * 查询结果处理--通知用户
 * @param commitBean
 */
@Override
public void sucess(PhoneAddressBean commitBean) {
    Toast.makeText(this, "查询成功", Toast.LENGTH_SHORT).show();
    textcontent.setText("归属地:" + commitBean.getResult().getProvince() + ",  运营商:" + commitBean.getResult().getCompany());
}
/**
 * 查询失败处理--通知用户
 * @param error
 */
@Override
public void failed(RetrofitError error) {
    //TODO 通知用户查询失败
}

@Override
public void OhterError(String string) {
    Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
}

 

 构造一个presenter 通过presenter确定使用哪个model处理数据;

 点击查询按钮,调用presenter中的查询方法进行查询。

 核心: doSearch()方法,发起查询,这个时候presenter上场了,事先在presenter中定义好处理的方法,在view层由构造的presenter对象调用。

   

view层接口:

public interface MvpDemoActivityI<T> {

    void sucess(T t);//查询成功

    void failed(RetrofitError error);//查询失败

    void OhterError(String string);//其他异常

}

  presenter中的逻辑处理:

  验证输入手机号的合法性,不合法通过接口通知view(OtherError(String str)),告诉用户输入有误,提醒用户重新输入。是合法数据,则调用model进行数据查询请求(网络访问服务器);

  拿到服务器响应json回掉通知presenter,再由presenter去通知view层更新(或通知用户)model与presenter之间也是通过接口进行通信。

public class MvpDemoActivityP {

    public Context context;
    private Context mContext;
    MvpDemoActivityI mvpDemoActivityI;
    MVPModel mvpModel;

    public MvpDemoActivityP(MvpDemoActivityI mvpDemoActivityI, Context context) {
        this.mvpDemoActivityI = mvpDemoActivityI;
        this.mvpModel = MVPModel.getHttpUtils(context);//构造model对象,由该对象发起model交互连线
    }
    /**
     * presenter和model的交互
     * @param phone
     * @param key
     */
    public void commitPhone(String phone, String key) {

        boolean isEm = Utils.getmUtils(context).isEmpty(phone);
        if (!isEm) {
            boolean b = Utils.getmUtils(context).isMobileNO(phone);
            if (b) {
                mvpModel.commit(phone, key, new ModelI<PhoneAddressBean>() {
                    @Override
                    public void sucess(PhoneAddressBean commitBean) {
                        //TODO 通知页面更新
                        mvpDemoActivityI.sucess(commitBean);//presenter和view事先约定好的接口
                    }
                    @Override
                    public void failed(RetrofitError error) {
                        mvpDemoActivityI.failed(error);//presenter和view事先约定好的接口

                    }
                });
            } else {
                mvpDemoActivityI.OhterError("格式非法,输入正确手机号");//格式非法,输入正确手机号,
//presenter和view事先约定好的接口
} } else { mvpDemoActivityI.OhterError("输入正确的手机号");//presenter和view事先约定好的接口
} }}



model:

 这里网络请求,我 用的是Retorfit.接口主要的作用就是把请求结果传给presenter。

/**
 * 网络请求数据,该方法为上传用户当前的经纬度
 * @param phone
 * @param mmodelI
 */
public void commit(String phone,String key , final ModelI mmodelI) {
    mDemoI.SearchPhone(phone, key, new Callback<PhoneAddressBean>() {
        @Override
        public void success(PhoneAddressBean commitBean, Response response) {
            mmodelI.sucess(commitBean);//接口回调给presenter

        }

        @Override
        public void failure(RetrofitError error) {
            mmodelI.failed(error);
        }
    });
}

底层的网络请求接口:  这里使用的是Retrofit网络框架来请求服务器数据

public interface MvpDemoI {
    //1.最后调用请求模板接口的方法.  参数放到一个集合中
    @GET("/mobile/get")
    public void SearchPhone(@Query("phone") String phone, @Query("key") String key,Callback<PhoneAddressBean> t);
}

  总结: mvp 中主要是通过接口实现view与model的数据传输,view不与model之间关联,而是通过presenter中的接口。model与presenter也是通过约定的接口传输处理结果;demo中有的地方使用到泛型,有的没有。正常开发最好还是设为泛型,封装成工具,避免代码臃肿多余。我就懒得改了。拖了几天,发到这记着。

  demo中有什么不正确的地方,大神们轻喷。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值