Google为Android开发者写了几个Demo,帮助开发者设计和制作App,地址如下:
https://github.com/googlesamples/android-architecture
这些框架有使用MVP的,也有使用MVVM的,同时还搭配了一些常用的库,很适合学习。
MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。
View 对应于Activity、Fragment,负责界面的绘制以及与用户交互。
Model 依然是业务逻辑和实体模型。
Presenter 负责完成View于Model间的交互。
我们先做一个简单的App,使用MVP实现登陆功能。
文件目录如下所示:
BasePresenter.java
public interface BasePresenter {
/**
* 页面初始化的时候做的事情,根据业务决定是否需要
*/
void start();
}
BaseView.java
public interface BaseView<T> {
/**
* 使用fragment作为view时,将activity中的presenter传递给fragment
*/
void setPresenter(T t);
}
LoginActivity.java
public class LoginActivity extends AppCompatActivity implements LoginContract.View {
private EditText edtAccount, edtPassword;
private Button btnLogin;
private LoginContract.Presenter mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
initParams();
}
private void initViews() {
edtAccount = findViewById(R.id.edt_account);
edtPassword = findViewById(R.id.edt_password);
btnLogin = findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.login();
}
});
}
private void initParams() {
mPresenter = new LoginPresenter(this);
}
@Override
protected void onResume() {
super.onResume();
mPresenter.start();
}
@Override
public void loginSuccess() {
Toast.makeText(LoginActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
startActivity(new Intent(LoginActivity.this, MainActivity.class));
}
@Override
public void loginError(String msg) {
Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public String getAccount() {
return edtAccount.getText().toString();
}
@Override
public String getPassword() {
return edtPassword.getText().toString();
}
@Override
public void setPresenter(LoginContract.Presenter presenter) {
}
}
LoginContract.java
public class LoginContract {
interface View extends BaseView<Presenter> {
void loginSuccess();
void loginError(String msg);
String getAccount();
String getPassword();
}
interface Presenter extends BasePresenter {
boolean login();
}
}
LoginHttp.java
public class LoginHttp {
private LoginHttp() {
}
public static LoginHttp getInstance() {
return Instance.LOGIN_HTTP;
}
private static class Instance {
private static final LoginHttp LOGIN_HTTP = new LoginHttp();
}
public boolean login(String account, String password) {
if (account.equals("aaa")&& password.equals("aaa")) {
return true;
}
return false;
}
}
LoginPresenter
public class LoginPresenter implements LoginContract.Presenter {
public LoginContract.View mView;
public LoginPresenter(LoginContract.View view) {
mView = view;
}
@Override
public boolean login() {
if (TextUtils.isEmpty(mView.getAccount())) {
mView.loginError("账户为空");
return false;
}
if (TextUtils.isEmpty(mView.getPassword())) {
mView.loginError("密码为空");
return false;
}
boolean result = LoginHttp.getInstance().login(mView.getAccount(), mView.getPassword());
if (result) {
mView.loginSuccess();
return true;
}
mView.loginError("账号或密码错误");
return false;
}
@Override
public void start() {
}
}