zoukankan      html  css  js  c++  java
  • Android之MVP模式实现登录和网络数据加载

    MVP简介

    相信大家对 MVC 都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,也是作为用户界面(用户层)的实现模式,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。

    MVC详见博客: Android之MVC模式的使用

    Model

    Model 是用户界面需要显示数据的抽象,也可以理解为从业务数据(结果)那里到用户界面的抽象。

    View

    视图这一层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment体现在了这一层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。

    Presenter

    Presenter这一层处理着程序各种逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由业务层做具体的业务操作,然后将得到的 Model 给 View 显示。

    MVCMVP的区别

    在 MVC 中:

    • View 可以与 Model 直接交互;
    • Controller 可以被多个 View 共享;
    • Controller 可以决定显示哪个 View 。

    在 MVP 中:

    • View 不直接与 Model 交互;
    • Presenter 与 View 通过接口来交互,更有利于添加单元测试;
    • 通常 View 与 Presenter 是一对一的,但复杂的 View 可能绑定多个 Presenter 来处理;
    • Presenter 也可以直接进行 View 上的渲染。

    模仿登录案例:(demo中包含登录和网络数据请求)

    model

    public class ModelSignIn implements ILoginSignIn {
    
        @Override
        public void onSignIn(String name, String pwd, IOnSetListenter listenter) {
            if (name.isEmpty())
            {
                if (listenter!=null)
                {
                    listenter.onError("输入用户名为空");
                    return;
                }
            }
            if (pwd.isEmpty())
            {
                if (listenter!=null)
                {
                    listenter.onError("输入密码为空");
                    return;
                }
            }
            if(name.equals("dickyqie") && pwd.equals("123456"))
            {
                if (listenter!=null)
                {
                    listenter.onError("登录成功");
                    return;
                }
            }else{
                if (listenter!=null)
                {
                    listenter.onError("登录失败");
                    return;
                }
            }
        }
    }

    presenter

    public class Presenter extends BasePresenter<IView> {
    
        ILoginSignIn iLoginSignIn=new ModelSignIn();
    
        public void setSignIn(String name,String pwd)
        {
           iLoginSignIn.onSignIn(name, pwd, new ILoginSignIn.IOnSetListenter() {
               IView view=getView();
               @Override
               public void onError(String error) {
                   if(view!=null){
                        view.showToast(error);
                   }
               }
    
               @Override
               public void onSccess(String repsonce) {
                   if(view!=null){
                       view.showToast(repsonce);
                   }
               }
           });
        }
    }

    activity

    public class MainActivity extends BaseActivity<IView,Presenter> implements IView,View.OnClickListener{
    
        EditText username;
        EditText password;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView()
        {
            username=(EditText)findViewById(R.id.username);
            password=(EditText)findViewById(R.id.password);
            findViewById(R.id.login).setOnClickListener(this);
        }
    
        @Override
        public Presenter createPersenter() {
            return new Presenter();
        }
    
        @Override
        public void onClick(View v) {
            String name=username.getText().toString();
            String pwd=password.getText().toString();
            p.setSignIn(name,pwd);
        }
    
        @Override
        public void showToast(String msg) {
            Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG).show();
        }
    }

    网络请求

    public class MainActivity extends BaseActivity<IView,Presenter> implements IView,View.OnClickListener {
    
        private TextView textView;
        private ProgessDialog dialog;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView(){
            textView=(TextView) findViewById(R.id.text);
            findViewById(R.id.btn).setOnClickListener(this);
        }
    
        @Override
        public void onLoadContributorStart() {
            showProgress();
        }
    
        @Override
        public void onLoadContribtorComplete(String topContributor) {
           //得到主线程的数据
            Message msg=new Message();
            msg.what=1;
            msg.obj=topContributor;
            handler.sendMessage(msg);
        }
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                dismissProgress();
                textView.setText(msg.obj.toString());
            }
        };
    
        @Override
        public void onClick(View v) {
            p.setGet();
        }
    
        @Override
        public Presenter createPresenter() {
            return new Presenter();
        }
    
        @Override
        public void onNetWork() {
            Toast.makeText(getApplicationContext(),"网络未连接",Toast.LENGTH_LONG).show();
        }
    
        @Override
        public void onError() {
            Toast.makeText(getApplicationContext(),"数据加载失败",Toast.LENGTH_LONG).show();
            textView.setText("");
        }
    
        /***
         * 启动
         */
        public void showProgress()
        {
            if(dialog==null)
            {
                dialog=new ProgessDialog(MainActivity.this);
            }
            dialog.showMessage("正在加载");
        }
    
        /***
         * 关闭
         */
        public void  dismissProgress()
        {
            if(dialog==null)
            {
                dialog=new ProgessDialog(this);
            }
            dialog.dismiss();
        }
    }

    不要忘记在AndroidManifest.xml加权限哦!

    <uses-permission android:name="android.permission.INTERNET"/>

    由于代码太多,完整代码未给出,源码直接下载即可

    源代码下载:https://github.com/DickyQie/android-development-model

  • 相关阅读:
    <a>元素生成多个<a>的问题,元素标签结尾影响
    mysql不能插入中文数据
    java: Multiple encodings set for module chunk test "GBK" will be used by compiler
    过滤器第二篇【高级应用】
    过滤器第一篇【介绍、入门、简单应用】
    客户关系管理系统
    Mysql中文乱码
    用户登陆注册【JDBC版】
    Mysql的基本命令图
    购物车小案例【简单版】
  • 原文地址:https://www.cnblogs.com/zhangqie/p/6371091.html
Copyright © 2011-2022 走看看