参考源码:https://github.com/antoniolg/androidmvp
MVP,分别代表Model,View,Presenter
使用MVP模式要创建很多接口,目的是解耦。下面是展示了一个很简单的demo,点击TextView,显示当前日期
Model:
在IModel接口里定义了获取数据的方法,Model继承该接口,主要实现获取数据的方法
public interface IModel {
void getData(ICallBack iCallBack);
interface ICallBack {
void onResult(String data);
}
}
public class Model implements IModel {
@Override
public void getData(final ICallBack iCallBack) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
iCallBack.onResult(new Date().toLocaleString());
}
}, 2000);
}
}
View:
IView接口中说明了页面布局的所有可能显示场景
public interface IView {
void showProgress();
void setData(String data);
void hideProgress();
}
Presenter:
是Model和View的协调者
public interface IPresenter {
void performOnClick();
}
public class Presenter implements IPresenter {
private IView iTextClickView;
private IModel iModel;
public Presenter(IView iTextClickView){
this.iTextClickView = iTextClickView;
iModel = new Model();
}
@Override
public void performOnClick() {
if (iTextClickView!=null){
iTextClickView.showProgress();
iModel.getData(new IModel.ICallBack() {
@Override
public void onResult(String data) {
String dataBack = "获取到的数据是:"+data;
iTextClickView.setData(dataBack);
iTextClickView.hideProgress();
}
});
}
}
}
Activity:
实现IView接口,具体实现页面不同状态下执行的操作。同时也要初始化Presenter,因为逻辑都在Presenter中呢
public class ClickTextActy extends Activity implements IView {
private TextView mTextView;
private IPresenter iPresenter;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acty_text_click);
//构建Presenter
iPresenter = new Presenter(this);
progressBar = (ProgressBar) findViewById(R.id.progress);
mTextView = (TextView) findViewById(R.id.mtext);
mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
iPresenter.performOnClick();
}
});
}
@Override
public void showProgress() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
progressBar.setVisibility(View.GONE);
}
@Override
public void setData(String data) {
mTextView.setText(data);
}
}