先来思考一般的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方法即可。
本文介绍了如何在ReadHub项目中使用Dagger2结合MVP模式进行开发。传统的MVP模式中,view层手动实例化presenter,而引入Dagger2后,presenter的实例化由框架自动完成。文章详细阐述了BaseContract、BaseActivity、BasePresenter的定义以及在具体Fragment中的应用,展示了如何通过依赖注入简化代码结构,提高代码复用性。
3240

被折叠的 条评论
为什么被折叠?



