前言
國(guó)慶長(zhǎng)假結(jié)束了,回到公司當(dāng)然是收心,認(rèn)真干活了眷射。今天回到公司,工作安排下屡穗,發(fā)現(xiàn)自己動(dòng)手的東西不太多,準(zhǔn)備寫(xiě)一個(gè)Android MVP系列的文章摊聋,進(jìn)行記錄和總結(jié)自己對(duì)MVP的理解鸡捐。
本系列共三篇:
Android MVP入門(mén)到進(jìn)階之-簡(jiǎn)單入門(mén)
Android MVP入門(mén)到進(jìn)階之-結(jié)合Dagger2
Android MVP入門(mén)到進(jìn)階之- 系統(tǒng)框架集成(完結(jié))
什么是MVP模式栈暇?
核心思想
MVP把Activity中的UI邏輯抽象成View接口麻裁,
把業(yè)務(wù)邏輯抽象成Presenter接口,
Model類(lèi)還是原來(lái)的Model源祈。
Android 中使用MVP的好處
1. 分離了視圖邏輯和業(yè)務(wù)邏輯煎源,降低了耦合
2. Activity只處理生命周期的任務(wù),代碼變得更加簡(jiǎn)潔
3. 視圖邏輯和業(yè)務(wù)邏輯分別抽象到了View和Presenter的接口中去香缺,提高代碼的可閱讀性
4. Presenter被抽象成接口手销,可以有多種具體的實(shí)現(xiàn),所以方便進(jìn)行單元測(cè)試
5. 業(yè)務(wù)邏輯抽到Presenter中去图张,避免后臺(tái)線程引用著Activity導(dǎo)致Activity的資源無(wú)法被系統(tǒng)回收從而引起內(nèi)存泄露和OOM
在Android 中使用MVP
創(chuàng)建BaseView接口
package com.marlon.simplemvpdemo.base;
/**
* @author Marlon
* @desc
* @date 2018/10/8
*/
public interface BaseView<T extends BasePresenter>{
void setPresenter(T presenter);//用于綁定View
void showToast(String msg);//將通用方法封裝到這里
//TODO 可以寫(xiě)上你常用的方法
}
創(chuàng)建BasePresenter接口
package com.marlon.simplemvpdemo.base;
/**
* @author Marlon
* @desc
* @date 2018/10/8
*/
public interface BasePresenter{
}
創(chuàng)建LoginContract來(lái)管理LoginView和LoginPresenter的方法接口
/**
* @author Marlon
* @desc
* @date 2018/10/8
*/
public class LoginContract {
public interface View extends BaseView<Presenter>{
void gotoMain();
}
public interface Presenter extends BasePresenter{
void login();
}
}
創(chuàng)建LoginPresenter實(shí)現(xiàn)LoginContract的Presenter的方法
/**
* @author Marlon
* @desc 創(chuàng)建LoginPresenter實(shí)現(xiàn)LoginContract的Presenter的方法
* @date 2018/10/8
*/
public class LoginPresenter implements LoginContract.Presenter {
private LoginContract.View mView;
public LoginPresenter(LoginContract.View view) {
this.mView = view;
mView.setPresenter(this);
}
@Override
public void login() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
Looper.prepare();
mView.showToast("登錄成功");
mView.gotoMain();
Looper.loop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
最后在LoginAcitvity中實(shí)現(xiàn)LoginContract的View接口
/**
* @author Marlon
* @desc LoginActivity
* @date 2018/10/8
*/
public class LoginActivity extends AppCompatActivity implements LoginContract.View {
private LoginContract.Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//初始化LoginPresenter
new LoginPresenter(this);
}
@Override
protected void onResume() {
super.onResume();
}
@Override //關(guān)聯(lián)LoginPresenter
public void setPresenter(LoginContract.Presenter presenter) {
mPresenter = presenter;
}
@Override
public void gotoMain() {
startActivity(new Intent(this, MainActivity.class));
}
@Override
public void showToast(String msg) {
Toast.makeText(this.getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
}
public void onClickLogin(View view) {
mPresenter.login();
}
}
到此我們一個(gè)簡(jiǎn)單的MVP框架就完成了锋拖,本次項(xiàng)目demo地址诈悍,方便大家查閱,喜歡給個(gè)小心心支持一下喲兽埃!此文章的項(xiàng)目的demo結(jié)構(gòu)模式侥钳,參照google官方項(xiàng)目 googlesamples中的todo?mvp
而來(lái),精簡(jiǎn)了許多內(nèi)容柄错,更適合初學(xué)者入門(mén)參考舷夺,有一定基礎(chǔ)的當(dāng)然還是建議參考官方demo哈,畢竟東西越多售貌。
總結(jié)
這只是mvp的冰山一角给猾,你可以看到,項(xiàng)目代碼中Activity還是簡(jiǎn)潔了不少颂跨,并且實(shí)現(xiàn)了業(yè)務(wù)和View的完全解耦敢伸, 對(duì)于模塊的不多的APP而言,d這個(gè)模式已經(jīng)能夠能滿足我們?nèi)粘5拈_(kāi)發(fā)了恒削,但是學(xué)海無(wú)涯详拙,知識(shí)是如此的美妙而又使人著迷,這樣簡(jiǎn)單而單調(diào)的模式蔓同,當(dāng)然不能滿足我們求知的欲望饶辙,我們將在下一篇介紹配合Dagger2使用MVP框架,有興趣的朋友一起來(lái)總結(jié)下哈詳見(jiàn):
Android MVP入門(mén)到進(jìn)階之-結(jié)合Dagger2
本文章為原創(chuàng)博客斑粱,轉(zhuǎn)載請(qǐng)注明出處弃揽!