過了這么久了,再寫MVP的文章是不是過時了矫户,_离斩。記錄下使用MVP過程中遇到的坑,從入門到放棄抽高。
參考資料和博主:
http://www.reibang.com/u/5c92e4ae9dc3
http://www.reibang.com/u/1d0c0bc634db
MVP判耕,全稱 Model-View-Presenter.
優(yōu)點:
降低耦合度,實現(xiàn)了Model和View真正的完全分離厨内,可以修改View而不影響Modle
模塊職責(zé)劃分明顯祈秕,層次清晰
隱藏數(shù)據(jù)
Presenter可以復(fù)用,一個Presenter可以用于多個View雏胃,而不需要更改Presenter的邏輯(當(dāng)然是在View的改動不影響業(yè)務(wù)邏輯的前提下)
利于測試驅(qū)動開發(fā)请毛。以前的Android開發(fā)是難以進行單元測試的(雖然很多Android開發(fā)者都沒有寫過測試用例,但是隨著項目變得越來越復(fù)雜瞭亮,沒有測試是很難保證軟件質(zhì)量的方仿;而且近幾年來Android上的測試框架已經(jīng)有了長足的發(fā)展——開始寫測試用例吧),在使用MVP的項目中Presenter對View是通過接口進行,在對Presenter進行不依賴UI環(huán)境的單元測試的時候仙蚜〈酥蓿可以通過Mock一個View對象,這個對象只需要實現(xiàn)了View的接口即可委粉。然后依賴注入到Presenter中呜师,單元測試的時候就可以完整的測試Presenter應(yīng)用邏輯的正確性。
View可以進行組件化贾节。在MVP當(dāng)中汁汗,View不依賴Model。這樣就可以讓View從特定的業(yè)務(wù)場景中脫離出來栗涂,可以說View可以做到對業(yè)務(wù)完全無知知牌。它只需要提供一系列接口提供給上層操作。這樣就可以做到高度可復(fù)用的View組件斤程。
代碼靈活性
缺點:
Presenter中除了應(yīng)用邏輯以外角寸,還有大量的View->Model,Model->View的手動同步邏輯忿墅,造成Presenter比較笨重扁藕,維護起來會比較困難。
由于對視圖的渲染放在了Presenter中球匕,所以視圖和Presenter的交互會過于頻繁纹磺。
如果Presenter過多地渲染了視圖,往往會使得它與特定的視圖的聯(lián)系過于緊密亮曹。一旦視圖需要變更橄杨,那么Presenter也需要變更了。
額外的代碼復(fù)雜度及學(xué)習(xí)成本照卦。
view代碼:負責(zé)失敗或者成功后的接口回調(diào)故慈。
public interface LoginView {
void onSuccess(String msg);
}
model代碼:負責(zé)數(shù)據(jù)的處理過程,比如請求http數(shù)據(jù)等框全。
public class LoginModel {
public boolean onLogin(String name, String pwd) {
boolean su = false;
if (name.equals("123456")) {
su = true;
} else {
su = false;
}
return su;
}
}
presenter代碼:最重要的察绷,連接view和model的紐帶,負責(zé)兩者之間的互通津辩,將數(shù)據(jù)和UI 分離拆撼。
public class LoginPresenter {
private LoginModel model;
private LoginView view;
public LoginPresenter(LoginView view) {
this.view = view;
model = new LoginModel();
}
public void onClicked(String name, String pwd) {
if (model.onLogin(name, pwd)) {
view.onSuccess("success");
} else {
view.onSuccess("error");
}
}
}
最后就是activity代碼:只負責(zé)UI顯示容劳,不負責(zé)數(shù)據(jù)處理過程。
public class MainActivity extends AppCompatActivity implements LoginView {
private EditText tvname, tvpwd;
private Button btn;
private LoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvname = findViewById(R.id.edit_name);
tvpwd = findViewById(R.id.edit_pwd);
btn = findViewById(R.id.btn);
presenter = new LoginPresenter(this);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.onClicked(tvname.getText().toString(), tvpwd.getText().toString());
}
});
}
@Override
public void onSuccess(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
這樣1.0入門版的MVP就寫好了闸度。O(∩_∩)O~竭贩,
但是有很多問題,內(nèi)存泄露等都沒考慮進去莺禁,嘚好好優(yōu)化一番留量。