Android十八章:5分鐘學(xué)會用MVP架構(gòu)開發(fā)Android項(xiàng)目

簡單的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)目主要有以下類組成

請配合項(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 。

  1. 在重寫的setPresenter方法要給mPresenter 賦值挚歧,這里會把LoginConstract.Presenter轉(zhuǎn)換為LoginPresenter類型扛稽。

  2. 在onCreate要實(shí)例化就是要new一個mLoginPresenter,這里的目的是賦值給LoginPresenter的view滑负,和讓view綁定LoginPresenter在张,之后才能在點(diǎn)擊事件調(diào)用login方法拉起登錄,在點(diǎn)擊事件調(diào)用mPresenter.login(...);矮慕。

  3. 然后就是正常邏輯的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ù)邏輯的所有方法的對象披摄。

請配合項(xiàng)目一起食用

學(xué)術(shù)上交流聯(lián)系方式:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亲雪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疚膊,更是在濱河造成了極大的恐慌义辕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寓盗,死亡現(xiàn)場離奇詭異灌砖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)傀蚌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門基显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人善炫,你說我怎么就攤上這事撩幽。” “怎么了箩艺?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵窜醉,是天一觀的道長制跟。 經(jīng)常有香客問我,道長酱虎,這世上最難降的妖魔是什么雨膨? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮读串,結(jié)果婚禮上聊记,老公的妹妹穿的比我還像新娘。我一直安慰自己恢暖,他們只是感情好排监,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杰捂,像睡著了一般舆床。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫁佳,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天挨队,我揣著相機(jī)與錄音,去河邊找鬼蒿往。 笑死盛垦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓤漏。 我是一名探鬼主播腾夯,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔬充!你這毒婦竟也來了蝶俱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饥漫,失蹤者是張志新(化名)和其女友劉穎榨呆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趾浅,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愕提,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了皿哨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浅侨。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖证膨,靈堂內(nèi)的尸體忽然破棺而出如输,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布不见,位于F島的核電站澳化,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稳吮。R本人自食惡果不足惜缎谷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灶似。 院中可真熱鬧列林,春花似錦、人聲如沸酪惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽春感。三九已至砌创,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲫懒,已是汗流浹背嫩实。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刀疙,地道東北人舶赔。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像谦秧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撵溃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容