美文网首页程序员之家android开发技巧Android架构设计
一行代码快速解耦Application逻辑,让Applicati

一行代码快速解耦Application逻辑,让Applicati

作者: AWeiLoveAndroid | 来源:发表于2017-12-26 13:12 被阅读5097次

    版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/23b9ba9b685d

    转载请标明出处:
    https://www.jianshu.com/p/23b9ba9b685d
    本文出自 AWeiLoveAndroid的博客


    【前言】很多人在开发中使用了大量的第三方的库,或者自己封装的库,很多库都是需要在Application里面配置的,如果配置过多,导致Application过于臃肿,代码不好维护,可读性比较差。下面是我写的一个简单的库,帮你快速解耦Application,让你的Application显得更简洁,更好维护。

    使用场景: Application里面配置的过多的时候,可以使用这个库。

    注意事项:
    1.目前只适用于普通开发,组件化插件化没做兼容处理。
    2.线程切换也没做考虑,因为一般的第三方库的使用基本都是在主线程,所以没做线程切换,后续有时间会慢慢完善的。
    3.进程有关的也没做处理,因为目前用到的三方库没有这方面的需求,所以没考虑这一块。

    1.首先来一张调用的图,如下,是不是很简单:
    调用方式
    2.下面看一下ApplicationHelper这个类做了什么事情:

    这是一个单例的类,调用init方法传入上下文,然后调用init开头的方法,比如initNetWork()就表示初始化网络操作的一些逻辑。

    ApplicationHelper这个类简单介绍
    3.ApplicationHelper实现了IInitMethods接口,这个接口主要用来规范有哪些逻辑要处理,它是初始化的所有方法的顶层接口,用于规范有哪些逻辑需要做,比如网络库,图片库等。
    IInitMethods接口
    4.ApplicationHelper类调用了InitWrapperImpl这个类,通过InitWrapperImpl.getInstance()返回一个实例对象,然后调用了init(mContext)方法,传入一个上下文,最后调用execute(XX,XX,XX)执行库的初始化的具体操作。
    InitWrapperImpl这个类的一个简单说明
    5.InitWrapperImpl这个类里面用到了常量类Contants,主要保存type类型,和库的名字的信息。
    常量类Contants
    6.InitWrapperImpl这个类它是实现了IInitWrapper接口,规范了具体的执行过程公用的一些接口方法。
    IInitWrapper接口
    到此,这个库基本就介绍完了,是不是很简单?想要源码的可以下面的链接获取。

    ApplicationHelper这个库,轻松实现Application的隔离型框架


    在这里也欢迎各位多提意见。感谢大家的支持。


    觉得不错的朋友们 点赞 或者 打赏 支持一下吧。

    相关文章

      网友评论

      • Kcwind:只有当逻辑够复杂的时候才需要解耦,否则就是过度设计了,但是话说回来,application里的逻辑真那么复杂了,是不是有这个必要呢。对于application我觉得还是尽量简化少点逻辑为好,能异步初始化或者在需要用的时候初始化的就不要放到application里为好吧
      • mrzhqiang:Dagger2
        mrzhqiang:@mrZ_9740 事实上,sqlbrite的sample,就很好地展示了dagger用于application的解耦
        mrzhqiang:@mrZ_9740 你的意思是,飞行员日常炒个菜就是大材小用,所以他一辈子都不能自己炒菜?
        AWeiLoveAndroid:Dagger2用在这里就有点大材小用了
      • AWeiLoveAndroid:下一步优化的地方:
        1、很多第三方SDK初始化时间过长的问题,这个要解决。
        2、考虑到多进程存在初始化的时候,可以判断只在主进程初始化,获取looper是否是主looper,具体代码如下:
        getMainLooper().getThread().getId();
        Thread.currentThread().getId();
      • Micrason:😇😇😇
      • dinus_developer:1. 过分设计了,
        2. 正确的设计理念应该是, 建立一个Initializer 接口, 里面有一个init()方法,
        然后依次建立 LoginInitializer、NetworkInitializer等 实现 Initializer
        3. 建立一个InitializerManager 统一调用实现Initializer 的类的init() 方法
        雪花偶遇闪电:@AWeiLoveAndroid 你竟然说创建多个类是过分设计?
        AWeiLoveAndroid:但是你想一下,我这里按功能划分有30个,你不可能写30个实现类吧,每个类就那么一个方法,你觉得哪个才是过分设计。。
      • fb5fbf432e63:没看出来比 把application的代码抽出方法 写成静态工具类调用好哪里去
        八进制:@心若浅沙 对的,能简单易懂最好,这个没有必要扩展,最怕的就是把简单复杂化
        fb5fbf432e63:@AWeiLoveAndroid 我的方案就是我说的这个啊. 我感觉写这些没必要
        AWeiLoveAndroid:大佬,你有什么其他的方案,指导一下
      • 谭冉冉:大佬,ApplicationHelper,下一步的优化方向可以,偏重一下 application里面很多第三方SDK初始化时间过长,导致app点击图标后卡死,需要等很久才进入主页的问题。
        QuincySx:@从不扰人 直接异步加载会不会出现使用框架报null的问题
        从不扰人:可以使用IntentService异步初始化时间过长的SDK
        AWeiLoveAndroid:这个问题也是我以后要解决的。目前只是把那些冗余的代码抽取出去了,下一步会考虑一下性能方面的问题
      • 鱼丸粗面X:这样封装起来确实不错,不过我没看出来ApplicationHelper有什么内存泄漏的问题啊?
        AWeiLoveAndroid:@野生搬运工 也有可能。。具体的还要在项目中去验证。。
        鱼丸粗面X:@AWeiLoveAndroid 你这初始化是在Application里面调用的,持有的也是Application类型的Context,这不会有内存泄漏的问题吧?
        AWeiLoveAndroid:静态上下文引用,以及静态对象引用 ,有可能会引起内存泄漏
      • b4e06d5e1620:过度设计了。
        AWeiLoveAndroid:大佬有何优化方式。。求指教
      • Swifty:helper 在oncreate里面new 即可避免leak application context
      • 9277d1463f65:这样写有什么好处?感觉分太多层了。
        AWeiLoveAndroid:@android小子 那肯定是很清爽的啊 。。维护起来也很方便的
        jockie911:有没有一种很清爽的感觉
        AWeiLoveAndroid:就是把application的初始化逻辑抽离出来 便于维护和拓展

      本文标题:一行代码快速解耦Application逻辑,让Applicati

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