Android应用开发之Android之MVP模式实现登录和网络数据加载
白羽 2018-08-10 来源 :网络 阅读 1365 评论 0

摘要:本文将带你了解Android应用开发之Android之MVP模式实现登录和网络数据加载,希望本文对大家学Android有所帮助

        本文将带你了解Android应用开发之Android之MVP模式实现登录和网络数据加载,希望本文对大家学Android有所帮助


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 显示。
MVC和MVP的区别
在 MVC 中:


View 可以与 Model 直接交互;

Controller 可以被多个 View 共享;

Controller 可以决定显示哪个 View 。

在 MVP 中:


View 不直接与 Model 交互;

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

模仿登录案例:(demo中包含登录和网络数据请求)
model
Java代码  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;              }          }      }  }  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
Java代码  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);                 }             }         });      }  }  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
Java代码  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{

    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();
    }
}
 网络请求
Java代码  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();      }  }  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加权限哦!
Html代码  <uses-permission android:name="android.permission.INTERNET"/>  <uses-permission android:name="android.permission.INTERNET"/>


 
   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved