本篇文章引用的是鸿阳的博客,关于mvp模式的使用在项目当中是越来越多,它的好处在于使得View和数据访问层进行脱离,虽然代码量和类增多了,但是在后期的维护和代码的解耦上发挥了它独有的优势.
下面就以登录为例:
首先在项目中的model包里面创建User对象
package com.example.mac.mvptest.model;
/**
* zhangy
* Created by mac on 2017/10/8.
*/
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;
}
}
然后在api的包里新建一个接口,IuserBiz用来定义登录的方法
package com.example.mac.mvptest.api;
/**
* Created by mac on 2017/10/8.
*/
public interface IuserBiz {
public void login(String username,String password,OnLoginCliback onLoginCliback);
}
其次,是我们来实现这个接口,这里通过线程睡眠的方式来模拟网络请求
package com.example.mac.mvptest.api;
import com.example.mac.mvptest.model.User;
/**
* zhangy
* Created by mac on 2017/10/8.
*/
public class UserBiz implements IuserBiz{
/**
* 处理登录的逻辑
* @param username 登录账号
* @param password 登录密码
* @param onLoginCliback 回调接口处理成功或者失败
*/
@Override
public void login(final String username, final String password, final OnLoginCliback onLoginCliback) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(username.equals("zhangy")&&password.equals("123456")){
User user=new User();
user.setUsername(username);
user.setPassword(password);
onLoginCliback.loginSucess(user);
}else{
onLoginCliback.loginonFiled();
}
}
}).start();
}
}
我们的这个实现类里面,OnLoginCliback接口定义的是登录成功和失败的方法
package com.example.mac.mvptest.api;
import com.example.mac.mvptest.model.User;
/**
* zhangy
* Created by mac on 2017/10/8.
*/
public interface OnLoginCliback {
public void loginSucess(User user);
public void loginonFiled();
}
现在就得考虑,当Activity如何跟api中的IuserBiz联系起来呢,那么我们就使用到Presenter模块,这个Presenter模块跟api有关系,跟Activity也有关系.那么这样的话,我们就创建一个关于View的一个接口
ILoginView
package com.example.mac.mvptest.api;
import com.example.mac.mvptest.model.User;
/**
* zhangy
* Created by mac on 2017/10/8.
*/
public interface ILoginView {
String getUsername();
String getPassword();
void ShowLoading();
void closedLoading();
void toActivity(User user);
void showErrorMmsg();
}
最后我们在实现这个接口的时候,在Activity里面去实现它,并引入我们的Presenter类
package com.example.mac.mvptest;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.mac.mvptest.api.ILoginView;
import com.example.mac.mvptest.model.User;
import com.example.mac.mvptest.presenter.LoginPersenter;
import com.example.mac.mvptest.view.Main2Activity;
public class MainActivity extends AppCompatActivity implements ILoginView{
private EditText mEd_Username,mEd_password;
private LoginPersenter loginPersenter;
private Button mbtn_Login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEd_Username= (EditText) findViewById(R.id.id_username);
mEd_password= (EditText) findViewById(R.id.id_password);
mbtn_Login= (Button) findViewById(R.id.id_login);
loginPersenter=new LoginPersenter(this);//初始化Persenter
mbtn_Login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loginPersenter.login();
}
});
}
@Override
public String getUsername() {
return mEd_Username.getText().toString();
}
@Override
public String getPassword() {
return mEd_password.getText().toString();
}
@Override
public void ShowLoading() {
Toast.makeText(this,"Loading...",Toast.LENGTH_LONG).show();
}
@Override
public void closedLoading() {
Toast.makeText(this,"Loadcloseding...",Toast.LENGTH_LONG).show();
}
@Override
public void toActivity(User user) {
startActivity(new Intent(this, Main2Activity.class));
}
@Override
public void showErrorMmsg() {
Toast.makeText(this,"Error...",Toast.LENGTH_LONG).show();
}
}
LoginPresenter类里面,目前只有登录的方法,我们在实际的项目开发过程中,可以添加其他的方法
package com.example.mac.mvptest.presenter;
import android.os.Handler;
import com.example.mac.mvptest.api.ILoginView;
import com.example.mac.mvptest.api.IuserBiz;
import com.example.mac.mvptest.api.OnLoginCliback;
import com.example.mac.mvptest.api.UserBiz;
import com.example.mac.mvptest.model.User;
/**
* zhangy
* Created by mac on 2017/10/8.
*/
public class LoginPersenter {
private ILoginView iLoginView;
private IuserBiz iuserBiz;
private Handler mHandler=new Handler();
public LoginPersenter(ILoginView iLoginView){
this.iLoginView=iLoginView;
iuserBiz=new UserBiz();
}
/**
* 处理登录的逻辑
*/
public void login(){
iLoginView.ShowLoading();//加载中
iuserBiz.login(iLoginView.getUsername(),iLoginView.getPassword(),
new OnLoginCliback() {
@Override
public void loginSucess(final User user) {
mHandler.post(new Runnable() {
@Override
public void run() {
iLoginView.closedLoading();
iLoginView.toActivity(user);
}
});
};
@Override
public void loginonFiled() {
mHandler.post(new Runnable() {
@Override
public void run() {
iLoginView.showErrorMmsg();
}
});
}
});
}
}