MVP设计模式的写法
Android里面用到的页面数据交互设计模式主要有三类,主要是MVC、MVP、MVVM,我用的最多的就是MVP,我个人觉得MVP更容易让人理解,因为它的逻辑性比较严密,而且也方便后期的在开发,当然缺点就是要写多写很多类和多写很多代码
主要分为三大块:
model:负责数据,持久化等操作
view:界面,视图,负责UI的绘制和用户的交互
present:连接model和view的桥梁
这里举个例子,这里的网络数据获取用到了OKHttp,还有JSON数据解析,用到了GSON
compile ‘com.zhy:okhttputils:2.6.2’
compile ‘com.google.code.gson:gson:2.8.0’
新建三个包:model、view、present
然后就是建类了,model、present、view分别写一个接口,比如这里view:
public interface ArticleCommentsView {
void showArticelComments(List<ResponseArticleComments.DataBean> dataBeen);
void showNoMoreDatas();
void showError();
}
model:
//由于这里我使用了OKhttp进行网络数据的获取,所以写了一个回掉
public interface ArticleCommentsModel {
void loadDatas(String url, Callback callback);
void loadNoMoreDatas();
public interface Callback{
void loadArticleCommentsDatas(List<ResponseArticleComments.DataBean> dataBeen);
void loadNoMoreDatas();
void loadFailed();
}
}
present:
public interface ArticleCommentsPresenter {
void loadDatas();//如果有什么关键字要从后台给的接口中post给服务器,括号里面要添加变量
//void loadDatas(String content);
}
然后就是需要写实体类去实现这三个接口
model:
public class ArticleCommentsModelImpl implements ArticleCommentsModel {
@Override
public void loadDatas(String url, final Callback callback) {
OkHttpUtils.get().url(url).build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
callback.loadFailed();
}
@Override
public void onResponse(String response, int id) {
ResponseArticleComments comments = JSON.parseObject(response, ResponseArticleComments.class);
if(comments.getData().getTotal().equals("0")){
callback.loadNoMoreDatas();
return;
}
callback.loadArticleCommentsDatas(comments.getData().getData());
}
});
}
@Override
public void loadNoMoreDatas() {
}
}
present://因为后台给的接口有页数,所以就添加了一个nextpage的翻页处理
public class ArticleCommentsPresenterImpl implements ArticleCommentsPresenter {
private ArticleCommentsModel model;
private ArticleCommentsView view;
private int nextpage = 1;
public ArticleCommentsPresenterImpl(ArticleCommentsView view) {
this.view = view;
this.model = new ArticleCommentsModelImpl();
}
@Override
public void loadDatas(String content) {
String url = UrlHandler.handlUrl(Apis.ARTICLE_COMMENTS, nextpage, content);
Log.d("ArticleCommentsPresente", url);
model.loadDatas(url, new ArticleCommentsModel.Callback() {
@Override
public void loadArticleCommentsDatas(List<ResponseArticleComments.DataBean> dataBeen) {
view.showArticelComments(dataBeen);
}
@Override
public void loadNoMoreDatas() {
view.showNoMoreDatas();
}
@Override
public void loadFailed() {
view.showError();
nextpage --;
}
});
nextpage ++;
}
@Override
public void refresh(String content) {
}
}
然后mvp这边就写完了,剩下的就是在activity或者fragment中去处理这些了
比如:
public class ArticleDetailsActivity extends BaseActivity implements ArticleCommentsView {
.....
}
这里只需要对present接口类定义全局变量,然后在onCreate中进行实例化
·commentsPresenter = new ArticleCommentsPresenterImpl(this);
commentsPresenter.loadDatas();
然后在实现view的方法里面进行数据和页面的交互处理
大体上就是这样了哦,希望对你有所帮助,谢谢了
UrlHandler 类:
public class UrlHandler {
/***
* http://cnblogs.davismy.com/Handler.ashx?op=GetTimeLine&channelpath={0}&page={1}
* {"data/123","1"}
*/
public static final String handlUrl(String url,Object... params){
for (int i = 0; i < params.length; i++) {
url = url.replace("{"+i+"}", params[i]+"");
}
return url;
}
}
上一篇: jsp自定义标签开发步骤
下一篇: 解决vue+webpack打包路径的问题