今天看了一下MVP接口膊夹,大致的流程自己簡單的梳理一下:Activity、Fragment實(shí)現(xiàn)對應(yīng)IView接口并重寫接口對應(yīng)的方法(主要是用戶讓P層來通知我們的activity(V層)刷新頁面)婆瓜。當(dāng)一個需要修改頁面的事件需要發(fā)生的時候,Activity或Fragment通過持有的P層對象贡羔,去調(diào)用Model的執(zhí)行特定的任務(wù)(P層持有Model層的對象以及View層的對象)廉白,在P層再去實(shí)現(xiàn)Model層的任務(wù)執(zhí)行返回接口接受回調(diào)。在P層接受到對于的回調(diào)后乖寒,根據(jù)自己的需求去使用view的去調(diào)用刷新Activity或Fragment的布局猴蹂,講了這么多,我們直接來代碼吧楣嘁。磅轻。。
我希望大家在看這篇文章的時候認(rèn)真逐虚,靜下心來去看聋溜,自己按照代碼打一遍,我相信你會有所收獲叭爱。
項目目錄:
1撮躁、大致以model、presenter與view分包
2买雾、model:按照功能模塊劃分把曼、分別有l(wèi)oginModel接口與其對于的實(shí)現(xiàn)類LoginImp
3、view:按照界面加功能點(diǎn)來分activity漓穿、fragment以及功能點(diǎn)loginView接口嗤军,activity和fragment分別會去實(shí)現(xiàn)不同的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 {
//回調(diào)接口
interface OnLoginListener {
void onLoginSuccess();
void onLoginFail();
}
void login(String username, String password, OnLoginListener onLoginListener);
}
LoginImp:LoginModel的接口的實(shí)現(xiàn)主要用戶數(shù)據(jù)的操作晃危,網(wǎng)絡(luò)請求叙赚,本地讀取等
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層 主要做網(wǎng)絡(luò)請求,實(shí)現(xiàn)OnLoginLister的回調(diào)山害,以及主要實(shí)際網(wǎng)絡(luò)請求
*/
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接口的實(shí)現(xiàn)纠俭,主要用來做登錄這個功能的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的實(shí)現(xiàn):
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", "隱藏進(jìn)度條");
}
@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;
}
}
};
}