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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值