必威体育Betway必威体育官网
当前位置:首页 > IT技术

ReadHub源码阅读笔记(二)dagger+MVP

时间:2019-07-04 02:43:25来源:IT技术作者:seo实验室小编阅读:56次「手机版」
 

readhub

先来思考一般的MVP模式,view层(活动和碎片)持有一个presenter并实例化,presenter通过构造器或set方法持有view引用。然后view层调用presenter方法,prensenter获取数据后调用view方法(界面操作)完成一次完整响应。

引入dagger后view层不再需要手动实例化presenter,由框架注入即可,这就是区别。

1.首先定义view和presenter的抽象BaseContract:

public interface BaseContract {

    interface BasePresenter<T extends BaseContract.BaseView> {
        void attachView(T view);

        void detachView();
    }

    interface BaseView {

presenter通过泛型声明关联的view类型,所需必要操作有获取view引用和解绑。view基本操作这里作者定义了一些网络错误显示进度条等操作,不是必需。

2.接下来看BaseActivity:(fragment一样)

public abstract class BaseActivity<T extends BaseContract.BasePresenter> extends RxAPPCompatActivity implements BaseContract.BaseView {
    @Nullable
    @Inject
    protected T mPresenter;

持有一个presenter实例,并且声明需要注入。然后在onCreate中调用presenter的attachView将自身引用交给presenter。

再定义一个BasePresenter类实现BaseContract.BasePresenter:

public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> {
    protected T mView;

    @Override
    public void attachView(T view) {
        this.mView = view;
    }

    @Override
    public void detachView() {
        if (mView != null) {
            mView = null;
        }
    }
}

这也是方便所有具体presenter不必再实现这两个方法。

3.开始使用:

Base类已经定义完了,接下来以项目中的一个Fragment为例,看看怎么使用。这是一个新闻列表界面,界面向presenter请求显示列表,presenter获取网络数据并调用view的方法更新界面。

首先定义抽象层:

public interface topicContract {
    interface View extends BaseContract.BaseView {
        void updateTopicData(String order, ArrayList<TopicMo> topicMos);
    }

    interface Presenter extends BaseContract.BasePresenter<View> {
        void getTopicNews(String order);
    }
}

在原有接口上的扩展。

真正的presenter,注释构造器提供注入。由于继承了BasePresenter所以不必实现绑定和解绑方法,view层继承BaseAty和BaseFra不必再实现BaseView的方法也是同理:

public class TopicPresenter extends BasePresenter<TopicContract.View> implements TopicContract.Presenter {
    @Inject
    public TopicPresenter() {
    }

    @Override
    public void getTopicNews(final String order) {
        App.apiService(readhubApiService.class)
                .apiTopic(order, constant.TOPIC_PAGE_SIZE)
                .compose(RxSchedulers.<TopicResp>io_main())
                .compose(mView.<TopicResp>bindToLife())
                .subscribe(new consumer<TopicResp>() {
                    @Override
                    public void accept(TopicResp topicResp) throws Exception {
                        if (topicResp != null && topicResp.data != null) {
                            //通知view更新界面
                            mView.updateTopicData(order, topicResp.data);
                        }
                    }
                }, new Consumer<throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        mView.showfailed();
                    }
                });
    }
}

然后fragment实现view接口(注意声明presenter类型):

public class TopicFragment extends BaseFragment<TopicPresenter> implements TopicContract.View {

依赖注入:

AndroidSupportInjection.inject(this);

fragment在合适时机调用presenter的getTopicNews方法即可。

相关阅读

JS红宝书·读书笔记

JavaScript高级程序设计 花了半个多月的时间,终于又把“JS红宝书”又撸了一遍。第一次读“JS红宝书”还是2015年初学JS的时候,那时

《高性能MySQL》读书笔记-InnoDB概述

在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个和表

Windows操作系统原理笔记

2.2 Windows 2000/xp 操作系统模型 这个系统融合了分层操作系统和客户/服务器(微内核)操作系统的特点.通过硬件机制实现了 核心

UE实践笔记:KJ法在用户研究中的应用

去年偶尔看到一篇将KJ法在UX界应用的文章,于是在后续两个项目中尝试使用了一下。下面结合两个实例,介绍这种好记又好用的方法。一.K

java使用Jacob笔记

因为项目需求,需要将word格式的文件转为pdf或者图片格式。在网上搜索后发现jacob相关的资料比较丰富,于是开始着手写demo。后来了解

分享到:

栏目导航

推荐阅读

热门阅读