前言
MVP模式,最早是由Taligent的Mike Pote 提出的,MVP的提出主要是为了解决MVC模式中结构过于复杂和模型-视图耦合性过高的问题。View和Model完全解除耦合。
一、MVP结构
参照Google官方的DEMO,制定了以下的方案。我们最终的目的是将复杂的业务逻辑处理与数据处理剥离视图层,视图层只作为展示。
二、分析各个层的作用
以下是项目中实际的代码分层,每个公司的架构分层可能都不一样,但是原则都是一样的,尽量清晰和相互之间的解耦,提高可读性与可维护性,让我们快速编完代码回家陪老婆孩子。😝
- adapter:放置列表的适配器(根据实际开发情况而定,可以不需要此层)
- base:Activity、view、presenter等封装的基类。
- bean: 数据模型。
- contract: 管理view接口和presenter接口。
- model: 进行网络数据与本地数据处理。
- presenter: 存放presenter。
- view: 存放activity,fragment。
三、核心代码讲解
请大家前往我的Github下载源码,记得帮忙点颗星。网上有很多版本,作者也是借鉴Google的例子进行了简单实用的封装,帮助大家快速应用到实际项目中去。
- Presenter层封装
代码很简单主要是思路,将View层(Activity)与Presenter层绑定的公共代码抽取到基类,目前采用的是弱引用,更好的方式应该是Presenter的生命周期长于Activity,后续我会继续优化。
public class BasePresenter<T> {
private WeakReference<T> mWeakReference;
protected WeakReference<T> mTWeakReference;
public void attachView(T view){
mTWeakReference=new WeakReference<T>(view);
}
public void detachView(){
if(mTWeakReference!=null){
mTWeakReference.clear();
}
}
protected T getView(){
return mTWeakReference.get();
}
}
- Activity抽取
代码依然很简单,将activity公共部分抽取出来进行封装。将创建Presenter步骤交给子类实现,分别在Activity创建的时候去绑定View,在Activity
public abstract class BaseActivity<V,T extends BasePresenter<V>> extends AppCompatActivity {
protected abstract int setLayoutId();
protected abstract T createPresenter();
public T presenter;
protected abstract void start();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(setLayoutId());
presenter = createPresenter();
presenter.attachView((V)this);
start();
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachView();
}
}
四、一起交流学习
大家有问题,可以加我的微信和QQ:379323664。
网友评论