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 显示。
MVC和MVP的区别
在 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"/>
由于代码太多,完整代码未给出,源码直接下载即可
源码点击下载
相关推荐
conganguo 2020-06-09
conganguo 2020-04-25
hanjingzheng 2019-12-01
AndroidBlackCat 2019-11-04
frimary 2019-10-30
89911735 2015-09-02
83397212 2019-09-11
limeng 2011-11-15
88473166 2019-07-01
88133557 2019-07-01
88473166 2019-06-28
89911735 2019-06-27
xuweinet 2019-06-27
xuweinet 2019-06-26
xzw 2019-06-20
DuncanDavid 2018-08-31
82103956 2016-02-17
82103956 2015-09-02
AndroidBlackCat 2014-08-28