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