Android——MVP架构
MVC和MVP的区别
MVC(Model View Controller),Model就是模型、View是视图、Controller就是控制器,(对应于Activity)。
Model在MVC架构中是真正的业务逻辑实现层,所以Model实际上是Business Model(业务模型)。而Controller主要负责把View的请求转发给Model,再把Model处理结果通知给View,Controller是用来解耦View和Model的,目的就是实现UI和逻辑的分离。
在实际的程序中,数据绑定、事件的处理都是在Activity中,导致Activity很复杂。此外,MVC的设计思想是从Model出发,没有考虑到View端的复杂性,这样的结果就是Model难以负荷复杂多变的View端。
MVP(Model View Presenter),其中presenter完全将Model和View进行分离,主要的逻辑程序在Presenter中实现。而且Presenter与具体的View没有直接的关联,而是通过定义好的接口进行交互,从而在保证Presenter的不变,即重用。在MVP中可以修改视图而不影响模型,所有的交互都发生在presenter内部。
MVP相对于MVC的好处:MVC中允许View和Model交互,而在MVC中两者之间的交互时通过presenter完成的。
通过例子学习:
布局:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/name_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="用户名" /> <EditText android:id="@+id/name_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/name_text"/> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/password_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text=" 密码 " /> <EditText android:id="@+id/password_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/password_text"/> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/login_button" android:layout_width="120dp" android:layout_height="wrap_content" android:text="Login" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_marginStart="39dp" /> <Button android:id="@+id/clear_button" android:layout_width="120dp" android:layout_height="wrap_content" android:text="Clear" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_marginEnd="34dp"/> </RelativeLayout> <ProgressBar android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
Model:
User
public class User { private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
IUserBiz
public interface IUserBiz { public void login(String userName,String password,OnLoginListener loginListener);}
OnLoginListener:
public interface OnLoginListener { void loginSuccess(User user); void loginFailed();}
UserBiz
public class UserBiz implements IUserBiz { @Override public void login(final String userName, final String password, final OnLoginListener loginListener) { new Thread(new Runnable() { @Override public void run() { if("lcy".equals(userName)&&"123".equals(password)){ User user=new User(); user.setPassword(password); user.setUserName(userName); loginListener.loginSuccess(user); }else{ loginListener.loginFailed(); } } }).start(); }}
View:
IUserView
public interface IUserLoginView { String getUserName(); String getPassWord(); void clearUserName(); void clearPassWord(); void showLoading(); void hideLoading(); void toMainActivity(User user); void showFailedError();}
MainActivity
public class MainActivity extends AppCompatActivity implements IUserLoginView{ private EditText nameText; private EditText passwordText; private Button loginButton; private Button clearButton; private ProgressBar progressBar; private UserLoginPresenter userLoginPresenter=new UserLoginPresenter(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); } void initViews(){ nameText= (EditText) findViewById(R.id.name_edit); passwordText=(EditText)findViewById(R.id.password_edit); loginButton=(Button)findViewById(R.id.login_button); clearButton=(Button)findViewById(R.id.clear_button); progressBar=(ProgressBar)findViewById(R.id.progressBar); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { userLoginPresenter.login(); } }); clearButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { userLoginPresenter.clear(); } }); } @Override public String getUserName() { return nameText.getText().toString(); } @Override public String getPassWord() { return passwordText.getText().toString(); } @Override public void clearUserName() { nameText.setText(""); } @Override public void clearPassWord() { passwordText.setText(""); } @Override public void showLoading() { progressBar.setVisibility(View.VISIBLE); } @Override public void hideLoading() { progressBar.setVisibility(View.GONE); } @Override public void toMainActivity(User user) { Toast.makeText(this, user.getUserName() + " login success , to MainActivity", Toast.LENGTH_SHORT).show(); } @Override public void showFailedError() { Toast.makeText(this, "login failed", Toast.LENGTH_SHORT).show(); }}
Presenter
public class UserLoginPresenter { private IUserLoginView userLoginView; private IUserBiz userBiz; private Handler mHandler=new Handler(); public UserLoginPresenter(IUserLoginView userLoginView){ this.userLoginView=userLoginView; this.userBiz=new UserBiz(); } public void login(){ userLoginView.showLoading(); userBiz.login(userLoginView.getUserName(), userLoginView.getPassWord(), new OnLoginListener() { @Override public void loginSuccess(final User user) { mHandler.post(new Runnable() { @Override public void run() { userLoginView.toMainActivity(user); userLoginView.hideLoading(); } }); } @Override public void loginFailed() { mHandler.post(new Runnable() { @Override public void run() { userLoginView.showFailedError(); userLoginView.hideLoading(); } }); } }); } public void clear(){ userLoginView.clearPassWord(); userLoginView.clearUserName(); }}
参考:http://www.cnblogs.com/JustRun1983/p/3727560.html
http://blog.csdn.net/lmj623565791/article/details/46596109
更多相关文章
- android中scrollTo和scrollBy的理解~~
- DrawerLayout-侧滑菜单
- Android动画详解(属性动画、视图动画和帧动画)
- android 触摸事件传递机制
- 【android】利用getViewTreeObserver().addOnGlobalLayoutListen
- Android(安卓)屏幕(View)坐标系统
- Android网络编程基础(一) - 基础知识
- Android实用视图动画及工具系列之三:表情加载动画和失败加载动画,
- Developers 设计之二 材料设计【翻译】