上一篇中主要介紹了MVP框架的基本實現過程,Android MVP架構(2)使用註解實現一個MVP框架
那麼實際過程中如何使用MVP框架呢。其實非常簡單。
MVP架構的主要目的就是進行解耦,同時使各部分的代碼邏輯層次分明,分工明確。鑑於這種思想,需要對功能類似的模塊進行規劃處理,以最基本的登錄註冊功能爲例,需要創建的目錄如圖:
可以看到,對比傳統的MVC架構,代碼文件彷佛增加了不少,但是層次卻更加分明瞭,通過嚴格的將模塊分爲MVP三層結構,使得拓展以及維護的可行性增加,閱讀性也更加良好。
以拓展一個登錄功能爲例,需要執行的步驟爲:
-
ILoginView 接口定義可能出現的登錄結果(失敗或成功)。
public interface ILoginView extends IBaseView {
void onLoginSuccessful(String msg);
void onLoginFail(int code, String error);
}
- IUserPresenter 接口模擬用戶執行登錄的過程(提供賬號密碼)。
public interface IUserPresenter {
void login(String username, String password);
}
- Model進行網絡請求的實現。
public class UserModel extends BaseModel implements IUserModel {
@Override
public void login(String username, String password, IResponseListener listener) {
Map<String, String> params = new HashMap<>();
params.put("username",username);
params.put("password",password);
doPost("login",params, listener);
}
}
- Presenter中調用Model層的實現,並將數據回調給View層。
public class UserPresenter extends BasePresenter<ILoginView>
implements IUserPresenter {
@Inject private
UserModel userModel;
@Override
public void login(String username, String password) {
userModel.login(username, password, new IResponseListener() {
@Override
public void onSuccessful(Result data) {
view.onLoginSuccessful(data.getMsg());
}
@Override
public void onFailure(int errorCode, String errorMsg) {
view.onLoginFail(errorCode, errorMsg);
}
@Override
public void finished() {
}
});
}
}
- Activity中調用Presenter,處理所實現View的回調。
public class LoginActivity
extends MvpActivity implements ILoginView {
EditText nameView;
EditText psdView;
@Inject
UserPresenter userPresenter;
ProgressDialog dialog;
@Override
protected void initView() {
super.initView();
nameView = findViewById(R.id.nameView);
psdView = findViewById(R.id.psdView);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void initData() {
super.initData();
dialog = new ProgressDialog(this);
}
public void login(View view) {
String username = nameView.getText().toString().trim();
String password = psdView.getText().toString().trim();
userPresenter.login(username, password);
dialog.setTitle("正在登錄。。。");
dialog.show();
}
@Override
public void onLoginSuccessful(String msg) {
dialog.dismiss();
Log.i(TAG, "onLoginSuccessful: " + msg);
//User user = JSON.parseObject(msg, User.class);
// TODO 處理返回的信息
}
@Override
public void onLoginFail(int code, String error) {
dialog.dismiss();
toast(code + " : " + error);
}
}
可以看到,在使用MVP架構之後,Activity的代碼得到了極大的簡化,開發人員可以專心的處理各個部分的邏輯功能。對於拓展,對源代碼的改動降到了最小,符合開閉原則。
最後貼一下源碼,有需要的小夥伴可以自行下載。資源下載