本篇文章引用的是鴻陽的博客,關於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();
}
});
}
});
}
}