今天看了一下MVP接口,大致的流程自己简单的梳理一下:Activity、Fragment实现对应IView接口并重写接口对应的方法(主要是用户让P层来通知我们的activity(V层)刷新页面)。当一个需要修改页面的事件需要发生的时候,Activity或Fragment通过持有的P层对象,去调用Model的执行特定的任务(P层持有Model层的对象以及View层的对象),在P层再去实现Model层的任务执行返回接口接受回调。在P层接受到对于的回调后,根据自己的需求去使用view的去调用刷新Activity或Fragment的布局,讲了这么多,我们直接来代码吧。。。
我希望大家在看这篇文章的时候认真,静下心来去看,自己按照代码打一遍,我相信你会有所收获。
项目目录:
1、大致以model、presenter与view分包
![](https://img.haomeiwen.com/i6078558/998e5c9701e8a3d6.png)
2、model:按照功能模块划分、分别有loginModel接口与其对于的实现类LoginImp
3、view:按照界面加功能点来分activity、fragment以及功能点loginView接口,activity和fragment分别会去实现不同的iView接口。
LoginModel接口:
package wait.love.com.mvptest.model.login;
/**
* Created by wanglinbo on 02/01/2019 10:01
* E-Mail Address:1105059963@qq.com
*/
public interface LoginModel {
//回调接口
interface OnLoginListener {
void onLoginSuccess();
void onLoginFail();
}
void login(String username, String password, OnLoginListener onLoginListener);
}
LoginImp:LoginModel的接口的实现主要用户数据的操作,网络请求,本地读取等
package wait.love.com.mvptest.model.login;
import android.os.Handler;
/**
* Created by wanglinbo on 02/01/2019 10:04
* E-Mail Address:1105059963@qq.com
* M层 主要做网络请求,实现OnLoginLister的回调,以及主要实际网络请求
*/
public class LoginImp implements LoginModel{
@Override
public void login(final String username, final String password, final OnLoginListener onLoginListener) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (username.equals("admin") && password.equals("123456")) {
onLoginListener.onLoginSuccess();
} else {
onLoginListener.onLoginFail();
}
}
}, 3000);
}
}
LoginPresenter接口:声明Activity或Fragment(V层)需要操作的方法
package wait.love.com.mvptest.presenter.login;
/**
* Created by wanglinbo on 02/01/2019 10:19
* E-Mail Address:1105059963@qq.com
*/
public interface LoginPresenter {
void doLogin(String name,String password);
}
LoginPresenterImp: LoginPresenterImp是LoginPresenter接口的实现,主要用来做登录这个功能的View与Model层的控制
package wait.love.com.mvptest.presenter.login;
import wait.love.com.mvptest.model.login.LoginModel;
import wait.love.com.mvptest.view.login.LoginView;
/**
* Created by wanglinbo on 02/01/2019 10:20
* E-Mail Address:1105059963@qq.com
*/
public class LoginPresenterImp implements LoginPresenter, LoginModel.OnLoginListener {
private LoginModel loginModel;
private LoginView loginView;
public LoginPresenterImp(LoginModel loginModel, LoginView loginView) {
this.loginModel = loginModel;
this.loginView = loginView;
}
@Override
public void onLoginSuccess() {
loginView.hideProgress();
loginView.loginSuccess();
loginView.changeData();
}
@Override
public void onLoginFail() {
loginView.hideProgress();
loginView.loginFail();
}
@Override
public void doLogin(String name, String password) {
loginView.showProgress();
loginModel.login(name,password,this);
}
}
LoginView:V层接口,
package wait.love.com.mvptest.view.login;
/**
* Created by wanglinbo on 02/01/2019 09:57
* E-Mail Address:1105059963@qq.com
* View层接口
*/
public interface LoginView {
void showProgress();
void hideProgress();
void changeData();
void loginSuccess();
void loginFail();
}
MainActivity:LoginView的实现:
public class MainActivityextends AppCompatActivityimplements LoginView {
private Buttonlogin;
private EditTextusername;
private EditTextpassword;
private LoginPresenterImploginPresenterImp =new LoginPresenterImp(new LoginImp(), this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
login =this.findViewById(R.id.login);
username =this.findViewById(R.id.username);
password =this.findViewById(R.id.password);
login.setOnClickListener(mClick);
}
@Override
public void showProgress() {
Log.i("xyz", "登录中");
}
@Override
public void hideProgress() {
Log.i("xyz", "隐藏进度条");
}
@Override
public void changeData() {
Toast.makeText(MainActivity.this.getApplicationContext(),"成功",Toast.LENGTH_LONG).show();
login.setText("登录成功");
}
@Override
public void loginSuccess() {
Log.i("xyz", "登录成功");
}
@Override
public void loginFail() {
Log.i("xyz", "登录失败");
}
private View.OnClickListenermClick =new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.login:
loginPresenterImp.doLogin(username.getText().toString().trim(), password.getText().toString().trim());
break;
}
}
};
}
网友评论