MVP架构封装
2018-01-31 12:39
162 查看
Android MVP框架设计
MVP结构:M层
数据层,数据可以是从远程服务器获取,也可以是从本地数据库获取.一般android应用中数据原大都为 远程服务器,所以M层的工作可以暂且看成就是网络请求部分. m层具体体现应该为网络请求相关代码
V层
数据展示层,将M层获取到的数据展示到前台告诉用户结果,具体体现为activity或者fragment等前台页面以及一些弹窗,TOAST提示等交互
P层
Presenter层,属于一个中间层,负责M层和V层之间的一个交互,也是mvp比较重要的一环,实现了M层和V 层的解耦
初步思路
由上面的一个关系图可以看出来M层和V层交互都在P层中,所以P层对M层或者V层应该是一个依赖组合的关 系,P层持有M层,V层对象或者以参数形式调用,代码实现: public class Presenter { private M m; private V v; public Presenter(M m, V v){ this.m = m; this.v = v; } public void login(String[] params){ m.login(params, new Callback(){ @Override public void onResponse(String result){ v.loginSuccess(result); } @Override public void onError(Exception e){ v.loginFailed(e); } }); } } public class M{ public void login(String[] params){ //此处为网络请求代码(OKHttp,Retrofit),省略... } } public interface V{ void loginSuccess(String result); void loginFailed(Exception e); } 然后在Activity或者fragment初始化presenter(activity自身实现view接口),在需要请求接口的地方 调用p.login();
进一步封装
思考:M层和View层交互在Presenter中,Presenter初始化在activity或者fragment中.是否可以 将presenter初始化放在BaseFragment或者BaseActivity中,在onCreate时候已经初始化. 问题已经提出来了,如何在一个类中将三个类关联起来,V<P, M>这种结构应该是可以的,通过泛型将三个类关 联起来,然后再获取泛型类型再通过Class.newInstance()初始化泛型对象.前提是泛型类型都有一个无参构 造方法, 获取泛型类型代码如下: public class TypeUtil { public static <T> T getType(int index, Object obj){ if (obj == null){ throw new NullPointerException("获取泛型的对象不能为空"); } Type superclass = obj.getClass().getGenericSuperclass(); if (superclass instanceof ParameterizedType){ Type[] types = ((ParameterizedType) superclass).getActualTypeArguments(); Type targetType = types[index]; try { return ((Class<T>) targetType).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassCastException e){ e.printStackTrace() 4000 ; } } return null; } public static Type getClassType(int index, Object obj){ if (obj == null){ throw new NullPointerException("获取泛型的对象不能为空"); } Type superclass = obj.getClass().getGenericSuperclass(); if (superclass instanceof ParameterizedType) { Type[] types = ((ParameterizedType) superclass).getActualTypeArguments(); return types[index]; } return null; } } obj.getClass().getGenericSuperclass()为获取父类的type类,如果父类是带有泛型的,那么就是type 就是ParameterizedType型的,然后强转并且调用getActualTypeArguments方法获取泛型数组 然后是BaseActivity代码,这里名字使用MVPActivity: public class MvpActivity<P extends BasePresenter, M> extends AppCompatActivity { protected P mPresenter; protected M mModel; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { mPresenter = getPresenterInstance(); mModel = getModelInstance(); if (mPresenter != null) { mPresenter.setModel(mModel, this); } super.onCreate(savedInstanceState); } private P getPresenterInstance(){ return TypeUtil.getType(0, this); } private M getModelInstance(){ return TypeUtil.getType(1, this); } protected P getPresenter(){ return mPresenter; } protected M getModel(){ return mModel; } } BasePresenter代码: public class BasePresenter<M, V> { private V mView; private M mModel; public void setModelView(M model, V v){ mModel = model; mView = v; } public <V extends IView> V getView() { return v; } public M getModel(){ return mModel; } } 使用方法: public class TestActivity extends MVPActivity<LoginPresenter, Model> implements View{ @Override protected void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); getPresenter.login(); } @Override public void loginSuccess(String result){ } @Override public void loginSuccess(String result){ } }
相关文章推荐
- Android MVP架构项目搭建封装,基类封装
- Android MVP架构简单封装
- MVP架构引导自己的封装思想
- android架构封装(mvp + rxandroid + Retrofit2.0 )
- 高级MVP架构封装演变全过程
- 基于MVP架构的OKHttp3的封装
- Base封装之我的最简MVP架构
- Android——MVP架构OkHttp的二次封装以及RecyclerView的使用
- 【Android架构】基于MVP模式的Retrofit2+RXjava封装(一)
- Android MVP架构简单封装
- 高级MVP架构封装演变全过程
- 【Android架构】基于MVP模式的Retrofit2+RXjava封装之文件下载(二)
- Android MVP架构 完整封装实例
- 高级MVP架构封装演变全过程
- 从零开始搭建一个完善的MVP开发框架(四) —对View(Activity,Fragment等)层组件进行封装简化View层的开发
- Android MVP架构,android-architecture
- MVP架构开发的鼠绘漫画客户端
- 谷歌 Basic MVP architecture 基础MVP架构示例
- Android MVP极限封装(一)
- Android架构之MVP