采用MVP构架,让activity只做ui的变化,数据的展示,让presenter做数据的处理,数据的传递,让Model做数据的网络获取。
这样就可以将原本全部存在Activity的成百上千行代码分离出来,增加代码可读性。只不过增加了类的个数。
下面演示一下流程图
image
展示一下实现Activity界面和数据拆分的几个类
MvpCallBack接口
MvpCallback接口是Model向presenter层传递数据的载体:
public interface MvpCallback {
/**
* 数据请求成功
* @param data
*/
void onSuccess(String data);
/**
* 数据请求成功 解析失败
* @param msg
*/
void onFailure(String msg);
/**
* 数据请求失败
*/
void onError();
/**
* 一次请求完成 不管成功或者失败
*/
void onComplete();
}
MvpModel中提供了向网络获取数据的方法,这里用handler.postDelay实现一个延时操作来模拟网络请求的情况
public class MvpModel {
public enum Action{
NORMAL,FAILUER,ERROR
}
public static void getNetData(final Action param,final MvpCallback callback){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
switch (param){
case NORMAL:
callback.onSuccess("请求成功");
break;
case FAILUER:
callback.onFailure("请求失败,参数有误");
break;
case ERROR:
callback.onError();
break;
}
callback.onComplete();
}
},2000);
}
MvpView接口是Presenter层向Activity层传递数据的载体,在presenter接受网络数据响应之后通过View接口让activity更新界面。
public interface MvpView {
/**
* 显示正在加载进度框
*/
void showLoading();
/**
* 隐藏正在加载进入框
*/
void hideLoading();
/**
* 请求数据成功后,调用此接口显示数据
* @param data
*/
void showData(String data);
/**
* 数据请求失败,调用
* @param msg
*/
void showFailureMessage(String msg);
/**
* 当数据请求异常,调用此接口提示
*/
void showErrorMessage();
}
Presenter类是具体的逻辑业务处理类,Presenter类的构造方法中有一个View接口的参数,是为了能够通过View接口通知Activity进行更新界面等操作。
public class MvpPresenter {
//View接口
private MvpView mvpView;
public MvpPresenter(MvpView view){
this.mvpView=view;
}
public void getData(MvpModel.Action param){
mvpView.showLoading();
MvpModel.getNetData(param, new MvpCallback() {
@Override
public void onSuccess(String data) {
mvpView.showData(data);
}
@Override
public void onFailure(String msg) {
mvpView.showFailureMessage(msg);
}
@Override
public void onError() {
mvpView.showErrorMessage();
}
@Override
public void onComplete() {
mvpView.hideLoading();
}
});
}
}
MainActivity 继承了一个MvpView类 并且定义了一个MvpPresenter对象
public class MainActivity extends AppCompatActivity implements MvpView {
private TextView tv_s;
private TextView tv_f;
private TextView tv_e;
ProgressDialog progressDialog;
MvpPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("yzh","1111111");
tv_s=(TextView)findViewById(R.id.tv_s);
tv_s.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.getData(MvpModel.Action.NORMAL);
}
});
tv_f=(TextView)findViewById(R.id.tv_f);
tv_f.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.getData(MvpModel.Action.FAILUER);
}
});
tv_e=(TextView)findViewById(R.id.tv_e);
tv_e.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.getData(MvpModel.Action.ERROR);
}
});
// 初始化进度条
progressDialog = new ProgressDialog(this);
progressDialog.setCancelable(false);
progressDialog.setMessage("正在加载数据");
//初始化Presenter
presenter = new MvpPresenter(this);
//presenter2绑定view
// presenter2=new MvpPresenter2();
// presenter2.attachView(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
// presenter2.detachView();
}
@Override
public void showLoading() {
if(!progressDialog.isShowing()){
progressDialog.show();
}
}
@Override
public void hideLoading() {
if(progressDialog.isShowing()){
progressDialog.dismiss();
}
}
@Override
public void showData(String data) {
if(!TextUtils.isEmpty(data)){
Toast.makeText(MainActivity.this,data,Toast.LENGTH_SHORT).show();
}
}
@Override
public void showFailureMessage(String msg) {
if(!TextUtils.isEmpty(msg)){
Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
}
}
@Override
public void showErrorMessage() {
Toast.makeText(MainActivity.this,"网络请求出错",Toast.LENGTH_SHORT).show();
}
}
下一步将提取冗余代码做父类,并且使用泛型数据,来防止多样的数据类型导致更多类的生产。
MVP框架搭建(2):mvp的分块演示
网友评论