MVPArms MVP快速集成框架

作者: JessYan | 来源:发表于2016-09-07 20:53 被阅读16001次

原文地址: http://www.jianshu.com/p/48e66e879061

Logo

前言

  • 今年的Android技术圈中MVP,Dagger2,Rxjava,Retrofit这些词汇非常火,随便打开一个技术论坛都充斥着大量的关于这些技术的文章,Github也充斥着各种以基于MVP+Retrofit+RxJava+Dagger2+MaterialDesign开发的xxxx为标题的开源项目或Demo.

  • 但是大家这么热心的开源此类项目,一直重复的做着同样的事教授大家使用的方式和技巧有没有想过依赖一个第三方库,就可以快速的搭建此类框架?

What is MVPArms?

  • MVPArms是一个集成了大量Android主流框架,并且全部使用Dagger2管理,以及提供API将所有库连接起来方便使用,还提供详细的Wiki文档.

  • 它可以使开发后面的所有项目都不用重复的复制粘贴(用过此类框架的朋友应该知道,这些库都依赖其它的库,就算一个build.gradle都会浪费很多时间),一个依赖省去很多烦恼,而且对于新手来说这些框架难的不仅仅是API的使用,更难的是怎么把它们结合到一起,应对各种场景的使用.

  • 对于一个新的Android项目,特别是熟练使用Dagger2Rxjava的开发者,你们只需要将此项目Clone下来,Demo只实现了一个页面,将此页面删除掉,添加所需要的Retrofit API,你的框架就搭建好了,你就可以直接使用Demo进行后续的开发,包结构也适合后面的扩展.

Notice

扩展项目, 了解一下:

Feature

  • 通用框架, 适合所有类型的项目, 支持大型项目的开发, 兼容组件化开发, 可作为组件化的 Base

  • Base 基类(BaseActivity, BaseFragment, BaseApplication ...)

  • MVP 基类(IModel, IVIew, IPresenter ...)

  • 框架高度可自定义化 (ConfigModule), 可在不修改框架源码的情况下对 Retoift, Okhttp, RxCache, Gson 等框架的特有属性进行自定义化配置, 可在不修改框架源码的情况下向 BaseApplication, BaseActivity, BaseFragment 的对应生命周期中插入任意代码, 并且框架独有的 ConfigModule 配置类, 可在不修改框架源码的情况下为框架轻松扩展任何新增功能

  • 独创的 RxLifeCycle 应用方式, 可在不继承 RxLifeCycle 提供的 ActivityFragment 的情况下, 正常使用 RxLifeCycle 的所有功能, 且使用方式不变

  • 独创的建造者模式 Module (GlobalConfigModule), 可实现使用 Dagger2 向框架任意位置注入自定义参数, 可轻松扩展任意自定义参数

  • 全局使用 Dagger2 管理 (将所有模块使用 Dagger2 连接起来, 绝不是简单的使用)

  • 全局监听整个 App 所有 Activity 以及 Fragment 的生命周期 (包括三方库), 并可向其生命周期内插入任意代码

  • 全局监听 Http Request(请求参数, Headers ...), Response (服务器返回的结果, Headers, 耗时 ...)等信息(包括 Glide 的请求), 可解析 json 后根据状态码做相应的全局操作以及数据加密, Cookie 管理等操作

  • 全局管理所有 Activity (包括三方库的 Activity), 可实现在整个 App 任意位置, 退出所有 Activity, 以及拿到前台 Activity 做相应的操作(如您可以在 App 任何位置做弹出 Dialog 的操作)

  • 全局 Rxjava 错误处理, 错误后自动重试, 捕捉整个应用的所有错误

  • 全局 UI 自适应

  • 图片加载类 ImageLoader 使用策略模式和建造者模式, 轻松切换图片加载框架, 方便功能扩展

  • 网络请求日志打印封装(提供解析后的服务器的请求信息和服务器的响应信息, 按可自定义的任意格式输出打印日志, 内置一个漂亮的打印格式模板)

  • 框架内自有组件的缓存机制封装(框架内可缓存内容的组件都提供有接口供外部开发者自定义缓存机制)

  • 代码生成插件(MVPArms 全家桶一键生成所需要的所有类文件)

  • Demo 修改包名后就可以直接使用, 快速接入(老项目接入请按下面的步骤)

Where?

MVPArms欢迎StarFork

Architectural

Architecture

Package Structure

package

How?

Wiki

详细用法请参照Wiki,下面只是简单的介绍下MVP

Contract

根据Google官方的MVP项目,可以在Contract中定义MVP的接口,便于管理,此框架使用Dagger注入Presenter无需定义Presenter接口,所以Contract只定义ModelView的接口

public interface UserContract {
    //对于经常使用的关于UI的方法可以定义到BaseView中,如显示隐藏进度条,和显示文字消息
    interface View extends BaseView {
        void setAdapter(DefaultAdapter adapter);
        void startLoadMore();
        void endLoadMore();
    }
    //Model层定义接口,外部只需关心model返回的数据,无需关心内部细节,及是否使用缓存
    interface Model {
        Observable<List<User>> getUsers(int lastIdQueried, boolean update);
    }
}

View

一般让ActivityFragment实现Contract中定义的View接口,供Presenter调用对应方法操作UI,BaseActivity默认注入Presenter,如想使用Presenter,必须指定Presenter的范型,和实现setupActivityComponent来提供Presenter需要的ComponentModule

public class UserActivity extends WEActivity<UserPresenter> implements UserContract.View {

    @Override
    protected void setupActivityComponent(AppComponent appComponent) {
        DaggerUserComponent
                .builder()
                .appComponent(appComponent)
                .userModule(new UserModule(this))
                .build()
                .inject(this);

    }

    @Override
    protected View initView() {
        return LayoutInflater.from(this).inflate(R.layout.activity_user, null, false);
    }

    @Override
    protected void initData() {
       }
}

Model

Model实现ContractModel接口,并且继承BaseModel,指定范型为ServiceManagerCacheManager,然后通过两个Manager拿到需要的ServiceCachePresenter提供需要的数据(是否使用缓存请自行选择,Presenter无需关心细节)

public class UserModel extends BaseModel<ServiceManager,CacheManager> implements UserContract.Model{
    private CommonService mCommonService;
    private CommonCache mCommonCache;

    public UserModel(ServiceManager serviceManager, CacheManager cacheManager) {
        super(serviceManager, cacheManager);
        this.mCommonService = mServiceManager.getCommonService();
        this.mCommonCache = mCacheManager.getCommonCache();
    }
    
    @Override
    public Observable<List<User>> getUsers(int lastIdQueried, boolean update) {
    
    }
  
}

Presenter

PresenterMVP中的大部分的作用为通过从Model层接口获取数据,在调用View层接口显示数据,首先实现BasePresenter,指定ModelView的范型,注意一定要指定Contract中定义的接口,Presenter需要的ModelView,都使用Dagger2注入,这样即解藕又方便测试,怎么注入?

@ActivityScope
public class UserPresenter extends BasePresenter<UserContract.Model, UserContract.View> {

    @Inject
    public UserPresenter(UserContract.Model model, UserContract.View rootView) {
        super(model, rootView);
    }
    //这里定义业务方法,相应用户的交互
    public void requestUsers(final boolean pullToRefresh) {
    }
}

Acknowledgement

感谢本框架所使用到的所有三方库的Author,以及所有为Open Sourece做无私贡献的DeveloperOrganizations,使我们能更好的工作和学习,本人也会将业余时间回报给开源社区

  1. MvpGoogle官方出品的Mvp架构项目,含有多个不同的架构分支(此为Dagger分支).
  2. Dagger2Google根据Square的Dagger1出品的依赖注入框架,通过Apt编译时生成代码,性能优于使用运行时反射技术的依赖注入框架.
  3. Rxjava提供优雅的响应式Api解决异步请求以及事件处理.
  4. RxAndroid为Android提供响应式Api.
  5. Rxlifecycle在Android上使用rxjava都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定activity和fragment的生命周期完美解决.
  6. RxCache是使用注解为Retrofit加入二级缓存(内存,磁盘)的缓存库.
  7. RxErroHandlerRxjava 的错误处理库,可在出现错误后重试.
  8. RxPermissions用于处理Android运行时权限的响应式库.
  9. RetrofitSquare出品的网络请求库,极大的减少了http请求的代码和步骤.
  10. Okhttp同样Square出品,不多介绍,做Android都应该知道.
  11. Autolayout鸿洋大神的Android全尺寸适配框架.
  12. GsonGoogle官方的Json Convert框架.
  13. ButterknifeJakeWharton大神出品的view注入框架.
  14. Androideventbus一个轻量级使用注解的Eventbus.
  15. TimberJakeWharton大神出品Log框架容器,内部代码极少,但是思想非常不错.
  16. Glide此库为本框架默认封装图片加载库,可参照着例子更改为其他的库,Api和Picasso差不多,缓存机制比Picasso复杂,速度快,适合处理大型图片流,支持 gif 图片,Fresco太大了!在5.0以下优势很大,5.0以上系统默认使用的内存管理和Fresco类似.
  17. LeakCanarySquare出品的专门用来检测AndroidJava的内存泄漏,通过通知栏提示内存泄漏信息.

Hello 我叫Jessyan,如果您喜欢我的文章,可以在以下平台关注我😘

相关文章

网友评论

  • 6faef730638b:太感谢了 最近为公司构思项目架构 看到MVPArms的一瞬间我就觉得就是它了,比我之前构思的要好很多,真的学习了不少 太感谢了🙏 我也会push我的思考实现为其出一份力
    JessYan:感谢认可
  • 下雨天的小白鞋:请问继承了ams框架后,直接采用px进行布局就可以UI自适应了 吗?
  • 下雨天的小白鞋:你好,请问我用的androidstudio3.1 canary5,为什么找不到DaggerxxxComponent和R 文件
  • 1b3d9544825b:类DaggerAppComponent无法找到,查看说明文档,依照文档在build.gradle中添加annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
    annotationProcessor rootProject.ext.dependencies["dagger2-compiler"]
    provided rootProject.ext.dependencies["javax.annotation"]
    也无法生成DaggerAppComponent类
    1b3d9544825b:@JessYan 好的,麻烦啦,谢谢!
    JessYan:@许建坤 as版本只能用正式版,不能用3.0,解决不了加 GitHub 上面显示的群
  • 77ab9f768da4:很奇怪,DaggerXXXXComponent是生成了,界面代码里也能点进去,但是编辑运行时候报DaggerXXXXComponent这个类找不到。难道是Mac上Android studio的问题?
  • 思念丶:项目导入后 全局监听整个 App 所有 Fragment 的生命周期 报错
    fragment No enclosing instance of type 'android.support.v4.app.FragmentManager' is in scope
  • 34f9b83fd747:我看了你的项目Rxjava的版本是2.0.7 我用的远程gradle依赖Rxjava版本是2.1.1 这就导致了observable这个类中的compose()方法不一致 这样你的项目中Rxutils的这个工具类报错 能给分析一下吗 大神
    34f9b83fd747:@lowkey_8153 也就是说如果我改成远程依赖的gradle 如下compile 'me.jessyan:arms:2.1.5' Rxutils就会报错
    34f9b83fd747:@JessYan 我现在的arms版本就是2.1.5 只是之前的compose方法 现在报错了
    JessYan:@lowkey_8153 我刚刚去确认了一下,我的最新版2.1.5是2.1.1,Arms每个月都会更新所有三方库为最新版,但前提是你也要更新框架
  • 林不懂:无法自动生成 DaggerAppComponent,Github desktop clone的项目,直接导入AS,版本2.33,Dagger2试了多个版本都不行
  • Hancock1993:I Love Open Sourece
  • 行云流水之灵:谢谢分享这么好的框架,学习了😊
  • longzekai:看好你,加油。
    5541018ebbcb:最近看了MVPArms的源码,学到了很多知识和思想。谢谢!
    JessYan:@longzekai 谢谢
  • icyvalley:就是有你这样无数的无私奉献者,才能让更多的人学到更多的技术,非常感谢!
    JessYan:@icyvalley 谢谢,使用的开源的同时分享开源,这样才会使开源社区良性循环
  • b65192e8c0bf:感谢楼主,我是在微信公众号看到的,正在拜读。
    JessYan:@白衣雨果 好的
  • 虞桀:感谢大神的贡献和对我的引导,对我这样的学生党来说,你们真的就是最好的老师,拜谢! :pray:
    JessYan:@可可源 认真找
    可可源:有一件生成Fragment 的吗,目前只有Activity
    JessYan:其实做开源并不能给我带来任何收入,相反我会投入更多时间去维护去优化,但是有你们的支持,是我走下去的动力,大家能一起分享知识一起进步,我觉得付出一切的都是值得的
  • OneBelowZero:mark 谢谢 楼主 ~ :relaxed:
  • eb9ab5a1f66e:加油大兄弟
  • 辽东小码农:好文,你的分包策略就把我吸引了,好好拜读一下!
  • 红发_SHANKS:一直关注,坚持更新代码,赞
    JessYan:@壹分Orz 公司的项目,一直也在用这个框架,所以也是一直在持续的优化,改进,谢谢支持
  • 红发_SHANKS:看完了wiki,非常不错,为什么不适用RXbus呢?【好奇脸】
    红发_SHANKS:@jessyan 嗯,点赞!话说看你晚上10点还在撸代码,勤奋党!这几天看了好多框架,还是你这个比较满意,作为一个小彩笔,灰常激动啊!感谢分享,吐槽一下,你们那栋大楼太大了....
    JessYan:@壹分Orz 个人习惯吧,我用的那个eventbus也是轻量级的,用注解指定目标方法和切换线程,代码简介也方便,之前用过rxjava subject,写的rxbus,始终觉得没这个方便,所以看个人习惯,rxbus的代码也就几十行,你喜欢,可以自己复制进来,这个框架初衷也是根据个人习惯做定制,不可能每个地方的人合每个人的胃口,我要做的只是搭建最根本的框架,保证扩展性,至于不同的需求,自己按需更改或者删除,最后达到同一个目的,就是一个依赖构建一个主流框架,以后开发新项目,再也不用复制粘贴过时的框架
  • 红发_SHANKS:你回头看看,我就在你身后....

本文标题:MVPArms MVP快速集成框架

本文链接:https://www.haomeiwen.com/subject/eptsettx.html