对于MVP的定义都已经非常熟悉了,真正的困难在于如何将三者之间关联起来.
关键字:接口,回调
MVP的流程无非就是M负责加载数据,V更新视图,而P作为中间媒介负责沟通M和V,那么P如何实现两者的联通呢?
P与M之间:通过接口回调联通,M加载数据后,在回调接口中将数据返回给P
P与V之间:P持有V的引用,当M将数据返回后,可以调用V中的方法更新UI
View层
public interface MvpView { /** * 显示加载进度 */ void showLoading(); /** * 隐藏进度 */ void hidddLoading(); /** * 显示成功的数据 */ void showData(String data); /** * 显示失败的信息 */ void showFaileMessage(String data); /** * 链接错误 */ void showErrorMessage(String data); }
Model层
/** * 模拟网络请求的类 */ public class MvpModel { public static void getNetData(final String param, final MvpCallback callback){ new Handler().postDelayed(new Runnable() { @Override public void run() { switch (param){ case "normal": callback.onSucess("请求成功!!!"); break; case "failure": callback.onFail("请求数据失败!!!"); break; case "error": callback.onError("链接错误"); break; } callback.onCoplemet(); } },2000); } }
Presenter代码
public class MvpPresenter { /** * 持有View的引用 */ private MvpView mvpView; public MvpPresenter(MvpView mvpView){ this.mvpView = mvpView; } public void getData(String param){ //显示进度条 mvpView.showLoading(); //获取网络数据 MvpModel.getNetData(param, new MvpCallback() { @Override public void onSucess(String mData) { mvpView.showData(mData); } @Override public void onFail(String mData) { mvpView.showFaileMessage(mData); } @Override public void onError(String mData) { mvpView.showErrorMessage(mData); } @Override public void onCoplemet() { mvpView.hidddLoading(); } }); } }
Callback接口
public interface MvpCallback { /** * 请求数据成功 */ void onSucess(String mData); /** * 请求数据失败 */ void onFail(String mData); /** * 请求数据错误 */ void onError(String mData); /** * 加载完毕 */ void onCoplemet(); }
Activity代码
public class MainActivity extends AppCompatActivity implements MvpView{ private ProgressDialog progressDialog; private TextView txt; MvpPresenter mvpPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mvpPresenter = new MvpPresenter(this); progressDialog = new ProgressDialog(this); progressDialog.setCancelable(false); progressDialog.setMessage("正在加载..."); txt = (TextView) findViewById(R.id.txt); } public void getDataSucess(View v){ mvpPresenter.getData("normal"); } public void getDataFail(View v){ mvpPresenter.getData("failure"); } public void getDataError(View v){ mvpPresenter.getData("error"); } @Override public void showLoading() { if (!progressDialog.isShowing()){ progressDialog.show(); } } @Override public void hidddLoading() { if (progressDialog.isShowing()){ progressDialog.dismiss(); } } @Override public void showData(String data) { txt.setText(data); } @Override public void showFaileMessage(String data) { txt.setText(data); } @Override public void showErrorMessage(String data) { txt.setText(data); } }