簡單的mvp架構(gòu)登錄demo譬猫,根據(jù)功能分包,參考自google mvp
主要面向有mvp經(jīng)驗(yàn)的讀者宴杀,閱讀時間大約 5 min
mvp 的思想是把顯示和業(yè)務(wù)邏輯從activity,fragment這些View中分離。讓model和view的通信通過Presenter來搞定郭毕,這樣子就降低了一個activity成千代碼量的可能,以后修改業(yè)務(wù)邏輯函荣,新增方法只要model層實(shí)現(xiàn)好显押,然后在Presenter層暴露接口給view調(diào)用就好了,mvp相比mvc會提項(xiàng)目結(jié)構(gòu)易讀性傻挂,也有一些不足就是要多寫類來協(xié)助開發(fā)乘碑,不太熟悉的同學(xué)就會拉慢開發(fā)速度。
View<===>Presenter<===>Model
項(xiàng)目主要有以下類組成
----login
|----LoginActivity.java
|----LoginContract.java
|----LoginPresenter.java
----BaseView.java
----BasePresenter.java
新建類BaseView.java
public interface BaseView<T> {
//在view層 給LoginConstract.Presenter賦值
void setPresenter(T presenter);
}
新建類BasePresenter.java
public interface BasePresenter {
//start方法表示進(jìn)行數(shù)據(jù)初始化金拒,這方法感覺沒用
void start();
}
這兩個base類是所有模塊都用到的基類兽肤。這里我們就不動它,然后具體某個模塊(比如登陸模塊用到的方法就在Login這個包里面新建LoginConstract殖蚕。
然后新建兩個接口分別是繼承BaseView的view接口轿衔,注意這里的BaseView帶泛型指向下面同級新建好的Presenter就行了。
以及繼承BasePresenter的Presenter接口睦疫,把操作ui界面的方法和業(yè)務(wù)邏輯的方法寫進(jìn)對應(yīng)的view和presenter接口害驹,就有了下面的LoginConstract類)
新建類LoginConstract.java
public interface LoginConstract{
public interface View extends BaseView<Presenter>{
void showProgressBar();//show進(jìn)度條的方法
void hideProgressBar
void onLoginSuccess();//登錄成功的方法
void onLoginError();
//...
}
public interface Presenter extends BasePresenter{
void login(String username,String password); //登錄的方法
//...
}
}
新建類LoginPresenter.java
LoginPresenter會實(shí)現(xiàn)LoginContract.Presenter接口,在login方法寫網(wǎng)絡(luò)請求的邏輯代碼蛤育⊥鸸伲可以理解為持有view對象,并且操作業(yè)務(wù)邏輯(登陸瓦糕,注冊底洗,獲取列表數(shù)據(jù))的類,有一個LoginConstract.View的全局變量mView咕娄。這個對象要賦值才能使用亥揖,所以我們會在LoginPresenter構(gòu)造方法給mView賦值。并且在構(gòu)造函數(shù)調(diào)用mView的setPresenter給View層的負(fù)責(zé)登陸業(yè)務(wù)的Presenter賦值。
public class LoginPresenter implements LoginConstract.Presenter {
private LoginConstract.View mView;
public LoginPresenter(LoginConstract.View view) {
this.mView = view;
this.mView.setPresenter(this);
}
@Override
public void login(final String username, final String password) {
//判斷username pwd這些參數(shù)合法性
//期間調(diào)用mView.showProgressBar();等操作ui的方法
//發(fā)送網(wǎng)絡(luò)請求
}
新建類LoginActivity.java
類要實(shí)現(xiàn)LoginConstract.View接口费变,期間會實(shí)現(xiàn)大量在LoginConstract.View的ui方法例如showProgressBar()啊摧扇。并且有一個全局變量是LoginConstract.Presenter類型的mPresenter 。
在重寫的setPresenter方法要給mPresenter 賦值挚歧,這里會把LoginConstract.Presenter轉(zhuǎn)換為LoginPresenter類型扛稽。
在onCreate要實(shí)例化就是要new一個mLoginPresenter,這里的目的是賦值給LoginPresenter的view滑负,和讓view綁定LoginPresenter在张,之后才能在點(diǎn)擊事件調(diào)用login方法拉起登錄,在點(diǎn)擊事件調(diào)用mPresenter.login(...);矮慕。
然后就是正常邏輯的initViews() 和initListeners()方法帮匾,給控件實(shí)例化,和注冊點(diǎn)擊事件等凡傅。
public class LoginActivity extends Activity implements LoginConstract.View {
private LoginConstract.Presenter mPresenter;
private EditText mUsername;
//...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
initListeners();
}
private void initListeners() {
mLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPresenter.login(mUsername.getText().toString(), mPassword.getText().toString());
}
});
}
private void initViews() {
mUsername = (EditText) findViewById(R.id.ed_username);
//...
mPresenter= new LoginPresenter(this);//給LoginPresenter的view賦值和讓view綁定presenter
}
@Override
public void setPresenter(LoginConstract.Presenter presenter) {
//LoginPresenter繼承了LoginConstract.Presenter辟狈,在這里會把LoginPresenter的實(shí)例賦值給mPresenter
this.mPresenter = presenter;
}
}
實(shí)現(xiàn)了LoginConstract.View接口就要重寫setPresenter方法給LoginConstract.Presenter 類型的全局變量賦值肠缔。要調(diào)用mPresenter.login方法必須先實(shí)例化mPresenter=new mLoginPresenter(this);這個對象夏跷。
注意,mPresenter主要是為了復(fù)制給view并讓view綁定Presenter明未,一定要先實(shí)例化mPresenter槽华,因?yàn)樵贚oginPresenter的構(gòu)造函數(shù)中,會傳入mView,才會讓LoginPresenter的mView有值趟妥,執(zhí)行LoginPresenter里面的login方法不會報錯猫态。
注釋
LoginConstract.View mView; 掌控view操作ui的所有方法的對象。
LoginConstract.Presenter mPresenter; 掌控view中操作業(yè)務(wù)邏輯的所有方法的對象披摄。
學(xué)術(shù)上交流聯(lián)系方式:
- QQ:953386166
- github:https://github.com/gdmec07120731