一千个人心中有一千个哈姆雷特,各人对相同东西的理解层次各不相同,但他们又是殊途同归,网上也看了很多别人理解的mvp,而且mvp也出现了很久,但我们自己的项目却没有用到mvp架构,主要是因为项目是一个比较老的项目,最近公司要做一个新的项目,我决定用一下mvp架构,现在来做一下笔记。
首先这是我mvp架构的一部分,
base文件夹:这里面基本就是一些基类,
bean文件夹: 实体类,
contact文件夹: 关联着mvp架构的,
model文件夹:做数据请求的
presenter文件夹:做model与view调度操作。
. 首先我们来看一下我的BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void setContentView(@LayoutRes int layoutResID) {
super.setContentView(layoutResID);
initView();
requestData();
}
/**
*todo:初始化组件
*time:2017/5/17 11:28
*update_time:2017/5/17
*params:
**/
public abstract void initView();
/**
*todo:请求数据
*time:2017/5/17 11:29
*update_time:2017/5/17
*params:
**/
public abstract void requestData();
}
一般打开一个界面都会做initView()与requestData()操作,所以我这里写两个抽象方法,让子类实现就好了。
再看一下我的BaseModel
public interface BaseModel {
void requestData(ZLRequestParam param);
}
我的BaseModel里面有一个请求数据的操作,因为所有的界面都有可能需要请求数据,反正我写一个接口来满足我的需求,
另外,ZLRequestParam 这个类里面有3个参数,我说明一下:
- url 网络请求的路径,
- params 需要的网络请求参数,
- ZLResponseCallback 网络请求的回调,返回成功与失败。
再看一下我的BasePresenter
public interface BasePresenter {
/**
*todo:关联model的请求数据
*time:2017/5/17 11:54
*update_time:2017/5/17
*params:
**/
void requestModelData();
}
就如上面的basemodel一样,我的BasePresenter一般可能会有一个调度网络请求的方法,我也同basemodel一样,写一个这样的接口来满足我们的需求。
再看看BaseView
public interface BaseView<T> {
/**
*todo:展示数据
*time:2017/5/17 11:36
*update_time:2017/5/17
*params:
**/
void setData(T t);
void showProgress();
void dismissProgress();
}
baseView里面有三个方法,我只说一下setData 因为我需要用presenter来调度数据展示,我只需要在presenter中调用这个setData方法就可以达到目的。所以我需要把数据提供过来,一般我们又不知道数据类型,这时我设置一个泛型数据。来满足我们的需求。
再看一下。ZLResponseCallback
public interface IResponseCallback {
/**
*todo:成功的请求
*time:2017/5/17 11:30
*update_time:2017/5/17
*params:返回的数据类型
**/
void responseSuccess(ZLResponse response);
void responseFailure();
}
这个类不难理解,但我需要说明的是ZLReponse
- 服务器返回的json数据,可以通过个这个数据,再用fastjson来转换成我们需要的数据。
- 网络请求路径
- 网络请示的成功或者与失败码
MainModelBean 这个类没有什么好说的,略过。
接下来,IMainContact类。
public interface IMainContact {
interface Model extends BaseModel {
}
interface View extends BaseView<MainModelBean> {
}
interface Presenter extends BasePresenter{
}
}
这里面我直接把需要的MVP结构全部串联在一起,别人过来看代码就会觉得代码结构特别清晰,里面有各自需要实现的接口,自己也可以定义一下自己需要的接口方法,当然一些基础的接口已经写在了接口基类中了,前面已经说了。
另外注意一下,我这个View的接口已经指定了泛型的数据类型。
接下来看一下MainModel
public class MainModel implements IMainContact.Model {
@Override
public void loadData(ZLRequestParam param) {
if(Const.network){
param.callback.responseSuccess(result);
}else{
param.callback.responseFailure();
}
}
}
这里面是做网络的请求,没有啥好说的呢。
再看一下如何使用这个MainPresenter
public class MainPresenter implements IMainContact.Presenter, IResponseCallback<MainModelBean> {
private IMainContact.View mainView;
private IMainContact.Model mainModel = new MainModel();
private Context mContext;
public MainPresenter(Context context, IMainContact.View view) {
this.mContext = context;
this.mainView = view;
}
@Override
public void requestModelData() {
//这里我自己创建了一个构造了一个请求的东西。
ZLRequestParam requestParam = new ZLRequestParam();
Map<String,String> params = new HashMap<>();
requestParam.url = "http://123432232";
requestParam.params = params;
requestParam.callback = this;
mainModel.loadData(requestParam);
}
@Override
public void responseSuccess(ZLResponse response) {
//获取到数据后来展示数据。
final MainModelBean mainModelBean = Json.parseObject(response.body,MainModelBean.class);
mainView.showData(mainModelBean);
mainView.dismissProgress();
}
@Override
public void responseFailure() {
Toast.makeText(mContext, "加载数据失败", Toast.LENGTH_SHORT).show();
mainView.dismissProgress();
}
}
再看一下MVPActivity
public class MVPActivity extends BaseActivity implements IMainContact.View {
private ProgressBar mProgressBar;
private TextView tvDetail;
private IMainContact.Presenter mMainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
@Override
public void initView() {
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
tvDetail = (TextView) findViewById(R.id.textView);
}
@Override
public void requestData() {
mMainPresenter = new MainPresenter(this, this);
//制造延迟效果
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mMainPresenter.loadModelData();
}
}, 2000);
}
@Override
public void setData(MainModelBean mainModelBean) {
StringBuilder sb = new StringBuilder();
sb.append("城市:");
sb.append(mainModelBean.city);
sb.append("时间:");
sb.append(mainModelBean.time);
sb.append("天气:");
sb.append(mainModelBean.weather);
tvDetail.setText(sb.toString());
}
@Override
public void showProgress() {
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void dismissProgress() {
mProgressBar.setVisibility(View.GONE);
}
}
这里的代码就没有啥好讲的了,大家直接看代码就行了。
这样整个mvp流程就算完成了。