android_mvp设计模式详解

本文详细介绍了MVP设计模式的概念及其在安卓应用开发中的具体应用。通过实例展示如何通过MVP模式实现视图层、模型层及逻辑层的解耦,从而提升代码可维护性和可读性。

Mvp定义

它是一种由MVC演变而来的设计模式,其中M-Model,V-View,P-Presenter.M层主要负责网络请求,数据处理,V层就是我们的视图层了(activity,fragment等),P层负责逻辑,控制着M层.使M与V层完全解耦.

Mvp的作用是什么呐?

当Mvp才出来的时候,我就去网上找了很多例子看了下,结果是一脸懵逼,太多的类与接口了,于是我就放弃了这种设计模式,然而当我在开发项目的时候发现自己的代码很乱,可读性很差,修改也很困难,于是乎我又在网上看了一些Mvp设计模式的资料,大体上都说,这种模式开发出来的项目,代码可读性强,修改起来方便,适合大型项目,团队开发.那么Mvp是不是真正有这些优势呐?这里我就模仿一个登录请求页面,请看下面的代码:

View层

1.首先我们创建一个LoginView的接口,这个接口对外开发四个方法(方法数量以及定义按实际需求写)showProgress()显示加载框的方法,dissProgress()取消加载框的方法, loginSuccess()登录成功的方法,loginFail()登录失败的方法.

  public  interface LoginView{

       void showProgress();

       void dissProgress();

       void loginSuccess();

        void loginFail();

}

2.我们再创建View层的Activity,比如名字LoginActivity去实现这个LoginView的接口

public class Loginctivity extends Activity implements LoginView{

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 

    } 

   @Override

   public void showProgress() 

    }

    @Override

   public void disssProgress() {

    }
    @Override
    public void loginSuccess() {
       
    }
    @Override
    public void loginFail() {
       
    }

}

Model层

1.同样我们先创建一个LoginModel的接口,接口里面对外提供一个login(String username,String pw)的登陆方法,另外在LoginModel内部再创建一个接口来监听login()方法是成功还是失败,如LoginListener接口,代码如下:

public interface LoginModel{

    interface LoginListener{

          void loginSuccess();

          void loginFail();

}

void login(String username,String pw,LoginListener loginlistener);

}

2.我们在1中model层的接口已经创建好了,那么现在我们就创建一个类来实现这个接口,LoginModelImp类,代码如下:

  public  class  loginModelImp implements LoginModel{

           @Override

    public void login(String username,String pw,LoginListener loginlistener) {

//可以看到这里我们需要实现loginlistener这个接口里面的两个方法loginSuccess(),loginFail()

//--假如我们这里做了一个登录请求,请求的代码就省略了我们只看登录结果

//--如果登录成功

  if(true){

     loginlistener.loginSuccess();

}

//--登录失败

else{

     loginlistener.loginFail()

}

       
    }

 

}

Presenter层

1.同样我们需要定义一个接口LoginPresenter,对外提供一个执行登录的方法doLogin()

public interface LoginPresenter{

     void  doLogin(String username,String pw);

}

2.定义一个类来实现loginpresenter接口,以及loginlistener接口

public class LoginPresenterImp implements LoginPresenter,LoginListener{

LoginView  loginview;

LoginModelImp loginModelImp;

public LoginPresenterImp(LoginView loginView, LoginModelImp loginModelImp) {
        this.loginView = loginView;
        this.loginModelImp = loginModelImp;
    }

@Override

    public void doLogin(String username, String pw) {

//--控制view层执行显示进度框方法,控制modl层去执行登录方法

         loginView.showProgress();
        loginModelImp.Login(username,pw,this);

        


    }

    @Override
    public void LoginSuccess() {
        //--再次启动请求成功后的方法,然后再view中执行
        loginView.hideProgress();
        loginView.loginSuccess();


    }
    @Override
    public void LoginFail() {
        //--再次启动请求失败后的方法,然后再view中执行
        loginView.hideProgress();
        loginView.loginFail();
    }

 

}

最后我们在LoginActivity中添加如下代码:

LoginPresenterImp  loginPresenterImp = new LoginPresenterImp(this, new LoginModelImp());

 loginPresenterImp.doLogin("10000", "123456");

总结:activity中调用登录方法,然后presenter中去控制model层登录,从而model层中loginlistener监听登录结果失败或者成功,并且将结果返回给presenter,最后presneter去控制view层执行的方法.我们从LoginPresenterImp这个类中可以看出,无论是Model层还是View层,他都是由Presenter层来控制的.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

基本功能 2016/10/31 添加抽奖功能,修复已知Bug(点击删除购物,出现闪退bug) 2016/10/28 添加微信分享功能 2016/10/28 添加忘记密码功能、完善用户评价系统、以及完善订单页面按钮功能及显示 2016/10/27 添加自动更新功能,修复已知的登陆闪退Bug 2016/10/26 添加订单查询(全部订单、待付款、待发货、待收货、待评价、退款和售后等查询)以及显示功能,收藏宝贝查询、及显示功能 2016/10/25 添加加入购物车功能、移除购物车中的商品和下单之后更新购物车等功能 2016/10/24 添加评论功能的显示、登陆用户的收藏和取消收藏功能、下单页面的显示、以及下单功能的实现 2016/10/23 添加商品的类别显示、分类查询展示、固定数据的搜索(暂时数据固定) 2016/10/22 添加用户注销功能、头像的上传以及更新用户个人资料功能 2016/10/20 添加注册、登陆、加载默认头像等功能、解决ViewPager Fragment 中Fragment被预加载问 2016/10/19 进行主页、微淘、问大家、购物车、我的淘宝等页面的设计、添加轮播图、资讯滚动条功能 2016/10/18 构建基本MVP框架 开发过程中遇到的问题(可能导致程序无法运行的bug)及解决方案 当用户未登录时,点击购物车,登陆之后,程序闪退 出现问题 :NullPointerException 解决方案: 使用Fragment的延时加载(懒加载)实现对数据的加载 拍照时无法进行图片的裁剪(不断加载) 解决步骤如下: Activity跳转时图库时的Intent如下 Intent takePhotoIntent = new Intent( “android.media.action.IMAGE_CAPTURE”); takePhotoIntent.putExtra( MediaStore.EXTRA_OUTPUT, imageUri); 在onActivityResult()方法中调用P层进行处理,相关代码如下 String uri = Environment.getExternalStorageDirectory() “/icoImage.jpg”; if(!allSelectedPicture.contains(uri)){ allSelectedPicture.add(uri); } ViewPager和Fragment结合使用,Fragment出现被预计载的情况 解决方案 项目中使用的主要技术及框架 框架 ButterKnife 注解绑定获取控件功能 Picasso 网络和本地图片的加载功能 okhttp 网络连接功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值