Android MVP 學(xué)習(xí)筆記

1.什么是MVP,這里就不做過多解釋,一張圖教你做人含末!

1424969040503730.png

2.直接說重點(diǎn),不逼逼即舌。
例如實(shí)現(xiàn)一個(gè)老生常談的登錄功能:

Model層

登陸的操作的接口

public interface LoginModel {
void login(String username, String password, OnLoginFinishedListener listener);
}

=======================================================

實(shí)現(xiàn)類LoginModelImpl
名字或者密碼為空則登陸失敗佣盒,否則登陸成功

public class LoginModelImpl implements LoginModel {
@Override
public void login(final String username, final String password, final OnLoginFinishedListener listener) {

    new Handler().postDelayed(new Runnable() {
        @Override public void run() {
            boolean error = false;
            if (TextUtils.isEmpty(username)){
                listener.onUsernameError();//model層里面回調(diào)listener
                error = true;
            }
            if (TextUtils.isEmpty(password)){
                listener.onPasswordError();
                error = true;
            }
            if (!error){
                listener.onSuccess();
            }
        }
    }, 2000);
}
}

==================================================

登陸事件監(jiān)聽

public interface OnLoginFinishedListener {

void onUsernameError();

void onPasswordError();

void onSuccess();
}

Presenter層

登陸的Presenter 的接口,實(shí)現(xiàn)類為L(zhǎng)oginPresenterImpl顽聂,完成登陸的驗(yàn)證肥惭,以及銷毀當(dāng)前view
 
public interface LoginPresenter {
    void validateCredentials(String username, String password);

    void onDestroy();
}

======================================================

 1 完成presenter的實(shí)現(xiàn)盯仪。這里面主要是Model層和View層的交互和操作。
 2 presenter里面還有個(gè)OnLoginFinishedListener蜜葱,
   其在Presenter層實(shí)現(xiàn)全景,給Model層回調(diào),更改View層的狀態(tài)牵囤,
   確保 Model層不直接操作View層爸黄。如果沒有這一接口在
   LoginPresenterImpl實(shí)現(xiàn)的話,LoginPresenterImpl只 有View和Model的引
   用那么Model怎么把結(jié)果告訴View呢揭鳞?
 
public class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener {
    private LoginView loginView;
    private LoginModel loginModel;

    public LoginPresenterImpl(LoginView loginView) {
        this.loginView = loginView;
        this.loginModel = new LoginModelImpl();
    }

    @Override
    public void validateCredentials(String username, String password) {
        if (loginView != null) {
            loginView.showProgress();
        }

        loginModel.login(username, password, this);
    }

    @Override
    public void onDestroy() {
        loginView = null;
    }

    @Override
    public void onUsernameError() {
        if (loginView != null) {
            loginView.setUsernameError();
            loginView.hideProgress();
        }
    }

    @Override
    public void onPasswordError() {
        if (loginView != null) {
            loginView.setPasswordError();
            loginView.hideProgress();
        }
    }

    @Override
    public void onSuccess() {
        if (loginView != null) {
            loginView.navigateToHome();
        }
    }
}

View層

登陸View的接口炕贵,實(shí)現(xiàn)類也就是登陸的activity

public interface LoginView {
void showProgress();

void hideProgress();

void setUsernameError();

void setPasswordError();

void navigateToHome();

}

=======================================================

  MVP模式中View層對(duì)應(yīng)一個(gè)activity,這里是登陸的activity
  的代碼流程:Activity做了一些UI初始化的東西并需要實(shí)例化對(duì)應(yīng)
  LoginPresenter的引用和實(shí)現(xiàn) LoginView的接口野崇,監(jiān)聽界面動(dòng)作称开,
  Go按鈕按下后即接收到查詢天氣的事件,在onClick里接收到即通過LoginPresenter
  的引用把它交給LoginPresenter處理乓梨。LoginPresenter接收到了登陸的邏輯就知道要登陸了鳖轰,
  然后LoginPresenter顯示進(jìn)度條并且把邏輯交給我們的Model去處理,也就是這里面的LoginModel扶镀,
 (LoginModel的實(shí)現(xiàn)類LoginModelImpl)脆霎,同時(shí)會(huì)把OnLoginFinishedListener也就是LoginPresenter
  自身傳遞給我們的Model(LoginModel)。LoginModel處理完邏輯之后狈惫,結(jié)果通過
  OnLoginFinishedListener回調(diào)通知LoginPresenter睛蛛,LoginPresenter再把結(jié)果返回給view層的Activity,
  最后activity顯示結(jié)果
 
public class LoginActivity extends Activity implements LoginView, View.OnClickListener {

    private ProgressBar progressBar;
    private EditText username;
    private EditText password;
    private LoginPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        progressBar = (ProgressBar) findViewById(R.id.progress);
        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);
        findViewById(R.id.button).setOnClickListener(this);

        presenter = new LoginPresenterImpl(this);
    }

    @Override
    protected void onDestroy() {
        presenter.onDestroy();
        super.onDestroy();
    }

    @Override
    public void showProgress() {
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideProgress() {
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void setUsernameError() {
        username.setError(getString(R.string.username_error));
    }

    @Override
    public void setPasswordError() {
        password.setError(getString(R.string.password_error));
    }

    @Override
    public void navigateToHome() {
// TODO       startActivity(new Intent(this, MainActivity.class));
        Toast.makeText(this,"login success",Toast.LENGTH_SHORT).show();
//        finish();
    }

    @Override
    public void onClick(View v) {
        presenter.validateCredentials(username.getText().toString(), password.getText().toString());
    }

}
QQ圖片20170728190708.png

什么胧谈?寫雞兒忆肾,啥也沒看懂?(滑稽)菱肖,單純的學(xué)習(xí)筆記客冈,看不懂就對(duì)了!

3.那為什么要用用MMP呢稳强?不對(duì)场仲,是MVP MVP MVP!M艘摺渠缕!,MMP的手誤了褒繁。

QQ圖片20170728190757.jpg
 1.層次分明亦鳞,各層級(jí)之間都不管對(duì)方如何實(shí)現(xiàn),只關(guān)注結(jié)果;
 2.在視圖層(Presentation Layer)使用MVP[架構(gòu)]  燕差,使原本臃
 的Activity(或Fragment)變得簡(jiǎn)單遭笋,其處理方法都交給了Presenter。 
 3.易于做[測(cè)試]徒探,只要基于每個(gè)模塊單獨(dú)做好單元測(cè)試就能確保整體的穩(wěn)定性瓦呼。 
 4.易于快速迭代,基于代碼的低耦合测暗,只需在業(yè)務(wù)邏輯上增加接口央串,
 然后在相應(yīng)的層級(jí)分別實(shí)現(xiàn)即可,絲毫不影響其他功能偷溺。

4 參考資料:
要什么參考資料?網(wǎng)站:www.baidu.com 自己搜去吧钱贯,騷年挫掏!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秩命,隨后出現(xiàn)的幾起案子尉共,更是在濱河造成了極大的恐慌,老刑警劉巖弃锐,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袄友,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡霹菊,警方通過查閱死者的電腦和手機(jī)剧蚣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旋廷,“玉大人鸠按,你說我怎么就攤上這事∪牡猓” “怎么了目尖?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扎运。 經(jīng)常有香客問我瑟曲,道長(zhǎng),這世上最難降的妖魔是什么豪治? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任洞拨,我火速辦了婚禮,結(jié)果婚禮上负拟,老公的妹妹穿的比我還像新娘扣甲。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布琉挖。 她就那樣靜靜地躺著启泣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪示辈。 梳的紋絲不亂的頭發(fā)上寥茫,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音矾麻,去河邊找鬼纱耻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛险耀,可吹牛的內(nèi)容都是我干的弄喘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甩牺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蘑志!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贬派,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤急但,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后搞乏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體波桩,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年请敦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镐躲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侍筛,死狀恐怖匀油,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勾笆,我是刑警寧澤敌蚜,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站窝爪,受9級(jí)特大地震影響弛车,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒲每,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一纷跛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邀杏,春花似錦贫奠、人聲如沸唬血。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拷恨。三九已至,卻和暖如春谢肾,著一層夾襖步出監(jiān)牢的瞬間腕侄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工芦疏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冕杠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓酸茴,卻偏偏與公主長(zhǎng)得像分预,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薪捍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 直接看README.md和源碼(todo-mvp分支)笼痹。根據(jù)tasks界面的功能畫了一張類圖,并根據(jù)模塊進(jìn)行劃分飘诗。...
    于曉飛93閱讀 440評(píng)論 2 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,095評(píng)論 25 707
  • 轉(zhuǎn)載至:http://www.reibang.com/p/9a6845b26856 “Android MVP 詳解...
    SnowDragonYY閱讀 10,322評(píng)論 5 241
  • 作者:李旺成 時(shí)間:2016年4月3日 “Android MVP 詳解(下)”已經(jīng)發(fā)布与倡,歡迎大家提建議界逛。 MVP ...
    diygreen閱讀 128,868評(píng)論 86 1,321
  • 【三件事】 1. 學(xué)習(xí)得到訂閱4篇文章 2.英語流利說1小時(shí) 3.畫一張漫畫 【小確幸】 一家人一起喝到臘八粥昆稿! ...
    Sabrina和向日葵閱讀 205評(píng)論 0 1