簡單學習mvp

mvp相信每個Android程序員都或多或少知道,model,view,presenter,今天我就簡單談一下自己的一些小的感受,大家都知道model是處理業務的,view是界面,presenter是控制器;我個人覺得mvp中view獲取界面的數據通過presenter傳遞給model,model獲取到presenter傳遞過來的數據提交服務器獲得返回的數據,presenter通過調用model的實現類定義的listener接口執行success或fail的操作將數據傳遞給view,調用view的接口方法將數據展示到view上,我講的比較亂,今天做了一個登陸的小demo,上圖。

文件夾:


這是登錄界面LoginActivity

public class LoginActivity extends AppCompatActivity implements IloginView{

    private Unbinder btterKnife;
    @BindView(R.id.et_account)
    EditText et_account;
    @BindView(R.id.et_password)
    EditText et_password;
    @BindView(R.id.login)
    Button login;
    private LoginPresenterImp loginPrenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        //添加註解
        btterKnife=ButterKnife.bind(this);
        loginPrenter=new LoginPresenterImp(getApplicationContext(),this);
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loginPrenter.loginData();
            }
        });
    }
    @Override
    public String getUserName() {
        return et_account.getText().toString().trim();
    }
    @Override
    public String getPassWord() {
        return et_password.getText().toString().trim();
    }
    @Override
    public void toMainActivity(User user) {
        Intent intent=new Intent(LoginActivity.this,MainActivity.class);
        intent.putExtra("user",user);
        startActivity(intent);
        finish();

    }
    @Override
    public void showErrorInfo(String str) {
        Toast.makeText(LoginActivity.this,str, Toast.LENGTH_SHORT).show();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        btterKnife.unbind();
    }
}

這是view需要的功能讀取和展示

public interface IloginView {

    String getUserName();
    String getPassWord();
    void toMainActivity(User user);
    void  showErrorInfo(String str);

}


這是presenter需要的方法執行登錄功能的接口供activity界面調用執行登錄

public interface IloginPresenter {
    void loginData();
}

這是presenter需要的方法調用view和model的功能

public class LoginPresenterImp implements IloginPresenter,LoginModelImple.OnLoginListener{

    private Context mContext;
    private IloginView loginView;
    private IloginModel iloginModel;

    public LoginPresenterImp(Context context, IloginView iloginView){
        this.mContext=context;
        this.loginView=iloginView;
        iloginModel = new LoginModelImple();
    }
    @Override
    public void loginData() {
        iloginModel.login(mContext,loginView.getUserName(),loginView.getPassWord(),this);
    }
    @Override
    public void onSuccess(User user) {
        loginView.toMainActivity(user);
    }
    @Override
    public void onFail(String str) {
       loginView.showErrorInfo(str);
    }
}

這是model需要的執行登錄功能的接口,供presenter調用

public interface IloginModel {
    void login(Context context,String username, String password, LoginModelImple.OnLoginListener listener);
}

這是model的實現方法,包含了listener,根據執行後結果返回值執行listener中不同的方法,將值傳到方法中,供presenter調用

這是view需要的功能讀取和展示

public class LoginModelImple implements IloginModel{
    @Override
    public void login(Context context, String username, String password, final OnLoginListener listener ) {
        if ("10086".equals(username) && "123".equals(password)) {
            User user = new User();
            user.setId(110);
            user.setUsername("大山");
            if (listener != null) {
                listener.onSuccess(user);
            }
        } else {
            if (listener != null) {
                listener.onFail("密碼錯誤");
            }
        }
    }
    public interface OnLoginListener{
        void onSuccess(User user);
        void onFail(String str);
    }

}

成果展示:





希望大家能學到自己需要的。

demo

點擊打開鏈接

發佈了39 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章