Android 開發(fā)中MVP框架的應(yīng)用

1.m指model谈秫,在項(xiàng)目中主要是指實(shí)體類和業(yè)務(wù)邏輯處理類
2.v指view,因?yàn)閙vp框架中把model和view進(jìn)行解耦,所以view功能點(diǎn)僅在于布局交互和生命周期的一些應(yīng)用。
3.p指presenter息尺,主要以接口的方式在view和model中進(jìn)行兩者間的信息交互。

下面是我寫的一個簡單的用戶登錄demo簡單來說明一下疾掰,


其中個項(xiàng)目中model中的model主要負(fù)責(zé)bean類和邏輯處理類掷倔,還有與presenter交互的接口ILogin。

/**
 * Created by Mr.wang
 * Date 2016/7/5
 * E-mail 1678173987@qq.com
 * Describe model類別个绍,對接presenter
 */
public interface ILogin {
    public void login(String username, String password, final OnLoginListener listener);

    public interface OnLoginListener{
        void onLoginSuccess( LoginModel model);
        void onFailed();
    }
}

model中的bean類 LoginModel

/**
 * Created by Mr.wang
 * Date 2016/7/5
 * E-mail 1678173987@qq.com
 * Describe 登陸的model
 */
public class LoginModel {
    private String username;//用戶名
    private String password;//密碼

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "LoginModel{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

model中的邏輯處理類Login

/**
 * Created by Mr.wang
 * Date 2016/7/5
 * E-mail 1678173987@qq.com
 * Describe
 */
public class Login implements ILogin{

    @Override
    public void login(final String username, final String password, final OnLoginListener listener) {
        //進(jìn)行登陸
        //進(jìn)行模擬登錄
        new Thread(){

            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //進(jìn)行模擬登錄
                if("123456".equals(username)&&"123".equals(password)){
                    LoginModel loginModel=new LoginModel();
                    loginModel.setUsername(username);
                    loginModel.setPassword(password);
                    listener.onLoginSuccess(loginModel);

                }else{
                    listener.onFailed();
                }

            }
        }.start();
    }
}

view中負(fù)責(zé)接入的接口LoginView

/**
 * Created by Mr.wang
 * Date 2016/7/5
 * E-mail 1678173987@qq.com
 * Describe  登陸接口進(jìn)行view登陸的接入
 */
public interface ILoginView {
    String getUsername();//得到username
    String getPassword();//得到password
    void clearUsername();//清除username
    void clearPassword();//清除password
    void showLoading();//顯示loading
    void hideLoading();//隱藏loading
    void toMainActivity(LoginModel model);//跳轉(zhuǎn)到mainActivity
    void showFailedError();//顯示錯誤信息
}

view中UI交互的LoginActivity

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.peng.mvpdemo.R;
import com.peng.mvpdemo.model.LoginModel;
import com.peng.mvpdemo.presenter.LoginPresenter;

/**
 * Created by Mr.wang
 * Date 2016/7/5
 * E-mail 1678173987@qq.com
 * Describe 登陸界面
 */
public class LoginActivity extends AppCompatActivity  implements ILoginView{

    private EditText etusername,etpassword;
    private Button btnlogin,btnclear;
    private ProgressBar progressbar;
    private LoginPresenter loginpresenter=new LoginPresenter(this);//view與presenter交互的地方

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

    private void initView() {
        etusername= (EditText) findViewById(R.id.edit_username);
        etpassword= (EditText) findViewById(R.id.edit_password);
        btnlogin= (Button) findViewById(R.id.login);
        btnclear= (Button) findViewById(R.id.clear);
        progressbar= (ProgressBar) findViewById(R.id.progressBar);
        btnlogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //進(jìn)行登錄
                loginpresenter.login();

            }
        });
        btnclear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //進(jìn)行清除
                loginpresenter.clear();
            }
        });


    }

    @Override
    public String getUsername() {
        return etusername.getText().toString().trim();
    }

    @Override
    public String getPassword() {
        return etpassword.getText().toString().trim();
    }

    @Override
    public void clearUsername() {

        etusername.setText("");
    }

    @Override
    public void clearPassword() {
etpassword.setText("");
    }

    @Override
    public void showLoading() {
progressbar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideLoading() {
progressbar.setVisibility(View.INVISIBLE);
    }

    @Override
    public void toMainActivity(LoginModel model) {
        Toast.makeText(this,"跳轉(zhuǎn)",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showFailedError() {
Toast.makeText(this,"登錄失敗",Toast.LENGTH_SHORT).show();
    }
}

mvp中負(fù)責(zé)解耦模塊的presenter

import android.os.Handler;

import com.peng.mvpdemo.model.ILogin;
import com.peng.mvpdemo.model.Login;
import com.peng.mvpdemo.model.LoginModel;
import com.peng.mvpdemo.view.ILoginView;

/**
 * Created by Mr.wang
 * Date 2016/7/5
 * E-mail 1678173987@qq.com
 * Describe  登陸的presenter
 */
public class LoginPresenter {

    private ILoginView loginView;//進(jìn)行view的控制
    private ILogin login;//鏈接model
    private Handler handler=new Handler();
    public LoginPresenter(ILoginView iLoginView){
        //構(gòu)造器進(jìn)行初始化對象的時候進(jìn)行初始化數(shù)據(jù)使用的勒葱,
        this.loginView=iLoginView;
        login=new Login();
    }

    /**
     * 登陸
     */
    public  void login(){
        loginView.showLoading();//顯示loading
        login.login(loginView.getUsername(), loginView.getPassword(), new ILogin.OnLoginListener() {
            @Override
            public void onLoginSuccess(final LoginModel model) {
                //登陸成功進(jìn)行更新 ui
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        loginView.toMainActivity(model);
                   loginView.hideLoading();
                    }
                });
            }

            @Override
            public void onFailed() {

                //同樣進(jìn)行更新ui
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        loginView.showFailedError();
                        loginView.hideLoading();
                    }
                });
            }
        });
    }
    /**
     * 進(jìn)行clear
     */
    public void clear(){
        loginView.clearUsername();
        loginView.clearPassword();
    }
}

附上demo地址
github上的demo地址

有問題加博主創(chuàng)建的Android高級技術(shù)交流群 :570650538

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巴柿,隨后出現(xiàn)的幾起案子凛虽,更是在濱河造成了極大的恐慌,老刑警劉巖广恢,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凯旋,死亡現(xiàn)場離奇詭異,居然都是意外死亡钉迷,警方通過查閱死者的電腦和手機(jī)至非,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糠聪,“玉大人荒椭,你說我怎么就攤上這事〗Ⅲ。” “怎么了趣惠?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長身害。 經(jīng)常有香客問我味悄,道長,這世上最難降的妖魔是什么塌鸯? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任侍瑟,我火速辦了婚禮,結(jié)果婚禮上丙猬,老公的妹妹穿的比我還像新娘涨颜。我一直安慰自己费韭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布咐低。 她就那樣靜靜地躺著,像睡著了一般袜腥。 火紅的嫁衣襯著肌膚如雪见擦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天羹令,我揣著相機(jī)與錄音鲤屡,去河邊找鬼。 笑死福侈,一個胖子當(dāng)著我的面吹牛酒来,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肪凛,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼堰汉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伟墙?” 一聲冷哼從身側(cè)響起翘鸭,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戳葵,沒想到半個月后就乓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拱烁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年生蚁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戏自。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡邦投,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出擅笔,到底是詐尸還是另有隱情尼摹,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布剂娄,位于F島的核電站蠢涝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏阅懦。R本人自食惡果不足惜和二,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耳胎。 院中可真熱鬧惯吕,春花似錦惕它、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堡距,卻和暖如春甲锡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羽戒。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工缤沦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人易稠。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓缸废,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驶社。 傳聞我的和親對象是個殘疾皇子企量,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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