android 架构之mvc

首先说下我现在认识的MVC与Android的各个组件的对应关系

 在android 中 activity  既要充当control 又要充当view

   view   与用户交互,响应用户操作

  control 接受view的事件请求,数据等。通知model  (说明activity持有model的实例)

   model  接受control的指令之后,独立运作,通知view

ui图如下:

model接口


model通知view更新数据的回调接口ILoginResult

activity(view 和control)

public class MainActivity extends AppCompatActivity implements ILoginResult,
        View.OnClickListener{
    private EditText mEdtName;
    private EditText mEdPwd;
    private Button mBtnSearch;
    private TextView mTvResult;
    private LoginModel mLoginModel;

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


    private void init() {
        mLoginModel=new LoginModel();
    }

    private void initEvent() {
        mBtnSearch.setOnClickListener(this);
    }


    private void initView() {
      mEdtName=findViewById(R.id.edt_name);
      mEdPwd=findViewById(R.id.edt_pwd);
      mBtnSearch=findViewById(R.id.btn_search);
      mTvResult=findViewById(R.id.tv_result);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_search:
                search();
                break;
        }
    }

//    搜索点击事件
    private void search() {
        String account = mEdtName.getText().toString().trim();
        String pwd = mEdPwd.getText().toString().trim();
        if(TextUtils.isEmpty(account)){
            Toast.makeText(this, "用户名不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        if(TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();
            return;
        }

        mLoginModel.getLoginInfo(account,pwd,this);

    }

    @Override
    public void loginSucess(String result) {
        mTvResult.setText(result);

    }

    @Override
    public void loginFail(String errorMsg) {
        mTvResult.setText(errorMsg);
    }
}

其中model接口的实现类如下

public class LoginModel implements ILoginModel{
    /**
     * 获取登录账户和密码
     * @param account
     * @param pwd
     * @param iLoginResult 回掉接口,用来通知view
     *
     * */
    @Override
    public void getLoginInfo(String account, String pwd, ILoginResult iLoginResult) {
        if(!"zhangsan".equals(account)){
            //用户名不对,login fail,通知view
            iLoginResult.loginFail("用户名不对");
            return;
        }
        if(!"123".equals(pwd)){
            //密码不正确 login fail,通知view
            iLoginResult.loginFail("密码不正确");
            return;
        }
        if("zhangsan".equals(account) && "123".equals(pwd)){
            //登录成功 login sucess ,通知view
            iLoginResult.loginSucess("登录成功");
        }
    }

}

是不是很简单,

 control 接受view的登陆事件的响应,将数据传递给model处理,处理完之后,通过接口回掉,将处理的结果通知view,view更新数据和ui

源代码:http://download.csdn.net/download/oneblue123/10258850

发布了137 篇原创文章 · 获赞 29 · 访问量 10万+
展开阅读全文

Android 当中的 MVC 和 MVP 究竟是如何区分的?

02-12

最近在看架构方面的资料,对于 MVC 和 MVP 有些搞不明白。 MVC: M 层就是用户自己编写的类,页面的逻辑都在这里实现(譬如访问数据库、访问网络、以及各种逻辑操作算法等等),可以总结归纳为 M 层的作用就是“这个页面的功能” V 层就是各种控件,用来接受用户信息(譬如各种按钮、各种编辑框)和展示信息给用户(类如TextView ImageView 等) C 层的概念我有些模糊,看一些博客上讲,它是沟通 M 和 V 的桥梁。我有些搞不懂。 我是这么理解的,我们需要在C 层当中创建 M 层的对象然后调用其相关方法:譬如访问网络方法、存储数据方法,而这些方法所用到的参数就通过V层来获取,同时如果M层有数据返回,那么V层可以直接操作这个返回的数据。 总感觉哪里不太对,请问大家,我这个理解有问题吗? MVP: 在这个模式里,是将Activity或者Fragment作为V层,而将原本 MVC 当中 C 层的沟通逻辑放到了新定义的 P 层当中。 是这样吗? ----------大年二十八update-------------- 我举个例子,譬如实现一个功能,用户输入一个id(数字),然后匹配数据库当中是否有这个id,如果有,就在页面上显示这个id对象的message,如果没有,就显示没有 在 MVC 当中 M 层自然有一个 String search(int id)方法,方法体就是通过id去执行查询 V 层就是获取用户输入的id,以及获取用户的点击查询输入,还有显示查询结果 C 层就是 Activity或者Fragment,我们在 Activity当中创建model对象并调用search方法,并且将V层输入的id作为参数传入。 所谓的M层和V层耦合,就是search方法返回的数据,可以直接调用 V 层的 text.settext(message )来将内容显示出来 我这么理解有问题吗? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览