1. 程式人生 > >Android開發學習--MVP模式入門

Android開發學習--MVP模式入門

handle ges span findview list pass override appcompat over

技術分享

1、模型與視圖完全分離,我們可以修改視圖而不影響模型
2、可以更高效地使用模型,因為所有的交互都發生在一個地方——Presenter內部
3、我們可以將一個Presenter用於多個視圖,而不需要改變Presenter的邏輯。這個特性非常的有用,因為視圖的變化總是比模型的變化頻繁。
4、如果我們把邏輯放在Presenter中,那麽我們就可以脫離用戶接口來測試這些邏輯(單元測試)

下面示例一個小案例:

項目架構:

技術分享

首先bean層:

User.java

public class User {
    private String username;
    
private String password; public String getUsername() { return username; } public String getPassword() { return password; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) {
this.password = password; } }

MainActivity.java

public class MainActivity extends AppCompatActivity implements IUserLoginView{
    private EditText musername;
    private EditText mpasssword;
    private Button mlogin;
    private Button mclear;
    private ProgressBar mpb;
    private UserLoginPresenter mUserLoginPresenter = new
UserLoginPresenter(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { musername = (EditText) findViewById(R.id.username); mpasssword = (EditText) findViewById(R.id.password); mlogin = (Button)findViewById(R.id.login); mclear = (Button)findViewById(R.id.clear); mpb = (ProgressBar) findViewById(R.id.pb); mlogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mUserLoginPresenter.login(); } }); mclear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mUserLoginPresenter.clear(); } }); } @Override public String getUsername() { return musername.getText().toString(); } @Override public String getPassword() { return mpasssword.getText().toString(); } @Override public void clearUsername() { musername.setText(""); } @Override public void clearPassword() { mpasssword.setText(""); } @Override public void showLoading() { mpb.setVisibility(View.VISIBLE); } @Override public void hideLoading() { mpb.setVisibility(View.GONE); } @Override public void toMainActivity(User user) { Toast.makeText(this, user.getUsername() + " login success , to MainActivity", Toast.LENGTH_SHORT).show(); } @Override public void showFailError() { Toast.makeText(this, "login failed", Toast.LENGTH_SHORT).show(); } }
IUserLoginView.java
public interface IUserLoginView {
    //操作的目的
    String getUsername();
    String getPassword();
    void clearUsername();
    void clearPassword();
    //友好的交互
    void showLoading();
    void hideLoading();
    //操作的結果,對應的反饋
    void toMainActivity(User user);
    void showFailError();

}
UserLoginPresenter.java
//Model和View的橋梁  login  clear
public class UserLoginPresenter {
    private IUserLoginView userLoginView;
    private IUserBiz userBiz;
    private Handler mHandler = new Handler();

    public UserLoginPresenter(IUserLoginView userLoginView){
        this.userLoginView = userLoginView;
        this.userBiz = new UserBiz();
    }

    public void login()
    {
        userLoginView.showLoading();
        userBiz.login(userLoginView.getUsername(), userLoginView.getPassword(),new OnLoginListener()
        {
            @Override
            public void loginsuccess(final User user)
            {
                //需要在UI線程執行
                mHandler.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        userLoginView.toMainActivity(user);
                        userLoginView.hideLoading();
                    }
                });

            }

            @Override
            public void loginfail()
            {
                //需要在UI線程執行
                mHandler.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        userLoginView.showFailError();
                        userLoginView.hideLoading();
                    }
                });

            }
        });
    }

    public void clear()
    {
        userLoginView.clearUsername();
        userLoginView.clearPassword();
    }
}
IUserBiz.java
public interface IUserBiz {
    public void login(String username,String password,OnLoginListener loginListener);
}
UserBiz.java
public class UserBiz implements  IUserBiz {

    @Override
    public void login(final String username,final String password, final OnLoginListener loginListener) {
        new Thread(){
            @Override
            public void run() {
                try
                {
                    Thread.sleep(2000);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }

                if("name".equals(username)&&"pwd".equals(password)){
                    User user = new User();
                    user.setUsername(username);
                    user.setPassword(password);
                    loginListener.loginsuccess(user);
                }else{
                    loginListener.loginfail();
                }


            }
        }.start();
    }
}

OnLoginListener.java

public interface OnLoginListener {
    void loginsuccess(User user);
    void loginfail();
}

技術分享技術分享

Android開發學習--MVP模式入門