欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVP设计模式的写法

程序员文章站 2022-06-08 22:24:14
...

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
MVP设计模式的写法
然后就是建类了,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;
    }
}