安卓/androidMVP开发模式的理解,以及代码讲解

MVP开发模式的理解,以及简单代码讲解

最近在网上看的MVP文章,根据自己的理解,特在此发篇文章记录下,这里我采用的是反向流程,文章如有需要优化之处,欢迎指导。也可加群进行讨论:855207609
在这里插入图片描述
在此啰嗦一句,首先看图,拿登录功能打比方说:
1、在View中调用P层(带输入数据)进行加载数据(此时还没请求接口)
2、在P中创建View和Model对象(此时的model层还没有创建,可以先省略)然后创建有参构造方法(View)
3、Model请求完接口后,将数据通过回调接口返回到P层,P在返回给VIew进行显示

项目结构图

在这里插入图片描述

  • MVP理解
    1.Model层:处理业务逻辑数据,如加载网络数据等(方法以及接口)
    2.View层:当P和V层执行完数据加载后进行回调给主线程进行显示(纯接口)
    3.Presenter层:是M和V的桥梁,是去小树林的必经之路。将View传递的请求数据传递给Model进行使用,当M请求完接口后,通过回调接口返回给P,此时P层通过已实例化的View将数据射入显示回调方法中进行UI显示。
View层

这里我把弹框抽离出来—使之公用;当然你也可以写在对应View层
作用:在主线程中进行implement此两个View用于最后的数据回调显示

public interface DialogView {
    /**
     * 显示弹框
     * @param message
     */
    void showDialog(String message);
    /**
     * 关闭弹框
     */
    void dismissDialog();
}

public interface LoginView {
    /**
     * 回调数据
     * @param result
     */
    void showData(String result);

//    /**
//     * 显示弹框
//     * @param message
//     */
//    void showDialog(String message);
//    /**
//     * 关闭弹框
//     */
//    void dismissDialog();
}
View层-Activity主线程调用:

首先实现View回调方法,然后调用P层方法,此时P层还没有创建

public class Login extends AppCompatActivity implements DialogView, LoginView {

    @BindView(R.id.et_Log_UserName)
    AutoCompleteTextView etLogUserName;
    @BindView(R.id.et_Log_PassWord)
    EditText etLogPassWord;
    @BindView(R.id.bt_Loading)
    Button btLoading;
    @BindView(R.id.email_login_form)
    LinearLayout emailLoginForm;
    private ProgressDialog mProgressDialog;

    private Handler mHandler;
    private Context mContext;
    private LoginPresenter loginPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        init();
        MyClick();

    }
    private void init(){
        mContext=Login.this;
        if (loginPresenter==null){
            loginPresenter=new LoginPresenter(this,this);
        }
        mHandler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what){
                    case 1:
                        Intent intent=new Intent(Login.this,Menu.class);
                        intent.putExtra("result",msg.obj.toString());
                        startActivityForResult(intent,1);
                        break;
                    default:
                            break;
                }
            }
        };

    }
    private void MyClick(){
        btLoading.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loginPresenter.reqLogin("test","123");
            }
        });
    }


    @Override
    public void showData(String result) {
//        Looper.prepare();
//        Toast.makeText(mContext, result+"", Toast.LENGTH_SHORT).show();
//        Looper.loop();
        Message msg=new Message();
        msg.what=1;
        msg.obj=result;
        mHandler.sendMessage(msg);

    }

    @Override
    public void showDialog(String message) {
        if (mProgressDialog==null){
            mProgressDialog=new ProgressDialog(Login.this);
        }
        mProgressDialog.setMessage(message);
        mProgressDialog.show();
    }

    @Override
    public void dismissDialog() {
        mProgressDialog.dismiss();
    }

}

Presenter层:

首先implement《P层》以及LoginModel对象等(此时还没有创建,所以我们要先去创建接口,然后在此实现其方法)》

public class LoginPresenter implements LoginIPresenter{
    private DialogView mDialog;
    private LoginView mLoginView;
    private LoginModel loginModel;
    public LoginPresenter(DialogView mDialog,LoginView mLoginView){
        this.mDialog=mDialog;
        this.mLoginView=mLoginView;
        if (loginModel==null){
            loginModel=new LoginModel();
        }
    }

//此处省略一些代码,内容请往下看
}


public interface LoginIPresenter {
    void reqLogin(String userName,String passWord);
}
Model层:

reqLogin方法中的LoginModel.LoginCallBack参数,可以先写上。此处是用于当请求完接口时直接回调给P层(如果有疑问,可以往下看,到P层可以看到请求方法中实现了一个 回调参数)

public interface LoginMode {
    void reqLogin(String userName, String passWord, LoginModel.LoginCallBack callBack);
}
Model层:

此时reqLogin方法中的参数添加了成功或失败回调接口,然后整体看一下是不是感觉,就像以前写在activity中的请求方法

public class LoginModel implements LoginMode{
    public LoginView loginView;
    @Override
    public void reqLogin(String userName, String passWord, final LoginCallBack callBack) {
        new Thread(){
            @Override
            public void run() {
                super.run();
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                int code=0;
                //请求接口
                //并返回数据,然后返回给view
                if (code==0){
                    callBack.onSuccess("登录成功");
                }else {
                    callBack.onError("登录失败,用户名或密码错误");
                }
            }
        }.start();
    }
	//这里的接口可以单独抽离出来,这里我就不抽离了
    public interface LoginCallBack{
        void onSuccess(String result);
        void onError(String error);
    }
}

Presenter层:

当P接口和M层创建完成后,创建弹框DialogView,登录LoginView,和登录LoginModel对象,然后创建有参构造并实例化View和Model并实例化,实现其方法

public class LoginPresenter implements LoginIPresenter{
    private DialogView mDialog;
    private LoginView mLoginView;
    private LoginModel loginModel;
    public LoginPresenter(DialogView mDialog,LoginView mLoginView){
        this.mDialog=mDialog;
        this.mLoginView=mLoginView;
        if (loginModel==null){
            loginModel=new LoginModel();
        }
    }

    @Override
    public void reqLogin(String userName, String passWord) {
        mDialog.showDialog("正在登陆中...");
        loginModel.reqLogin(userName, passWord, new LoginModel.LoginCallBack() {
            /**
             * 成功回调数据
             * @param result
             */
            @Override
            public void onSuccess(String result) {
                mDialog.dismissDialog();
                mLoginView.showData(result);
            }

            //失败回调原因
            @Override
            public void onError(String error) {
                mDialog.dismissDialog();
                mLoginView.showData(error);
            }
        });
    }
}

推荐文章:https://blog.csdn.net/limonzet/article/details/53328315
源码Git___Demo------>>>>>>diudiudiu

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本功能 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、付费专栏及课程。

余额充值