MVP模式:
1,view 层 负责显示,里面会初始化Presenter
2,Model层提供数据,常常有javabean类,并且不止一个接口
3.Presenter :从Model层拿到数据,初始化view层接口,更改视图
下面直接上代码:
Activity:// Activity 实现implements LoadingContract.View层,用来显示视图 public class MainActivity extends AppCompatActivity implements LoadingContract.View { private EditText mEtNum; private EditText mEtPassword; private Button mLoding; private LoadingContract.Presenter mPresenter; private ProgressDialog mProgressDialog; private String mNum; private String mPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 这里很关键,否则具体实现逻辑层Presenter会报空 // 这里接的是this,而LoadingPresenter的构造参数是LoadingContract.View, // 因为本类MainActivity实现了LoadingContract.View,故可以传this new LoadingPresenter(this); initView(); } @Override protected void onResume() { super.onResume(); // 公共的方法写在BasePresenter里面 mPresenter.start(); } @Override protected void onDestroy() { super.onDestroy(); mPresenter.stop(); } private void initView() { mEtNum = (EditText) findViewById(R.id.number); mEtPassword = (EditText) findViewById(R.id.password); mLoding = (Button) findViewById(R.id.btn); mProgressDialog = new ProgressDialog(this); } public void click(View view){ final String url = "http://www.baidu.com"; mNum = mEtNum.getText() .toString(); mPassword = mEtPassword.getText() .toString(); mPresenter.submit(this,url,mNum,mPassword); } @Override public void showErro(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT) .show(); } @Override public void showLoading() { mProgressDialog.show(); } @Override public void showSucceed() { Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT) .show(); } @Override public void dismissLoading() { mProgressDialog.dismiss(); } @Override public void setPresenter(LoadingContract.Presenter presenter) { this.mPresenter = presenter; } }
Contract:public class LoadingContract { // BasePresenter也是自定义,里面有2个未实现方法 interface Presenter extends BasePresenter{ // 继承BasePresenter,是出于Presenter当中可能会有N多的未实现方法,这样 // 就可以将一些公共的方法写在BasePresenter里面 void submit(Context context,String url,String num,String password); } interface View extends BaseView<LoadingContract.Presenter>{ void showErro(String msg); void showLoading(); void showSucceed(); void dismissLoading(); } }
Presenter:public class LoadingPresenter implements LoadingContract.Presenter { private LoadingContract.View mView; public LoadingPresenter(LoadingContract.View view) { // 构造函数,用来初始化 this.mView = view; view.setPresenter(this); } @Override public void submit(final Context context, String url, final String num, final String password) { mView.showLoading(); // 延时3秒,模拟登录操作 new Handler().postDelayed(new Runnable() { @Override public void run() { mView.dismissLoading(); if (num.equals("123") && password.equals("123") ){ mView.showSucceed(); context.startActivity(new Intent(context, SecondActivity.class)); }else { mView.showErro("帐号或者密码错误"); } } }, 3000); } @Override public void start() { Log.d("ztf", " start====> " ); } @Override public void stop() { Log.d("ztf", " stop====> " ); } }
BasePresenter
public interface BasePresenter {
void start(); void stop(); }
public interface BaseView<T> { void setPresenter(T presenter); }
源码下载.