Android 開(kāi)發(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)行兩者間的信息交互。

下面是我寫(xiě)的一個(gè)簡(jiǎn)單的用戶登錄demo簡(jiǎn)單來(lái)說(shuō)明一下,


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

/**
 * Created by Mr.wang
 * Date 2016/7/5
 * E-mail 1678173987@qq.com
 * Describe model類別,對(duì)接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();//顯示錯(cuò)誤信息
}

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)行初始化對(duì)象的時(shí)候進(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地址

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容