ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

献给android原生应用层开发初学者技术架构选型和整合的方案思路(四)

2019-04-03 19:47:36  阅读:339  来源: 互联网

标签:封装 savedInstanceState fun 初学者 override mDelegate android onCreate 应用层


续前篇《献给android原生应用层开发初学者技术架构选型和整合的方案思路(三)

本构架采用的 多Activity + 多 Fragments 开发模块,所以以下先介绍BaseFragment 一步步封装的过程。

以下的成品代码可见本人放在 GitHub 上的项目。

  1. 新建一个 package,比如叫 general.core,在些 package中新建一个抽象 Kotlin Class,取名RxLifecycleMvRxFragment,本对象用来继承BaseMvRxFragment,可以获得 MvRx MVVM 架构的相关功能,同时实现rxLifeCycle2库的接口LifecycleProvider<FragmentEvent>以解决 RxJava的内存泄露问题。通过BehaviorSubject对象 override Fragment 的各个生命周期函数对外发射生命周期事件,实现Fragment生命周期事件感知。RxLifeCycle官方文档表示可以继承他们的 RxAppCompatDialogFragment抽象类,但是因为类的单继承特性,继承类已经被BaseMvRxFragment占用,故打开RxAppCompatDialogFragment的源代码直接复制即可,因为面向接口编程的设计原则,后续只针对LifecycleProvider<FragmentEvent>进行操作,故不需继承官方的 BaseFragment,方便我们自己封装。参见文章《解决RxJava内存泄漏》。代码示例如下:

    abstract class RxLifecycleMvRxFragment : BaseMvRxFragment(), LifecycleProvider<FragmentEvent> {
        private val lifecycleSubject = BehaviorSubject.create<FragmentEvent>()
        @CheckResult
        override fun lifecycle(): Observable<FragmentEvent> {
            return this.lifecycleSubject.hide()
        }
    
        @CheckResult
        override fun <T> bindUntilEvent(event: FragmentEvent): LifecycleTransformer<T> {
            return RxLifecycle.bindUntilEvent(this.lifecycleSubject, event)
        }
    
        @CheckResult
        override fun <T> bindToLifecycle(): LifecycleTransformer<T> {
            return RxLifecycleAndroid.bindFragment(this.lifecycleSubject)
        }
    
        override fun onAttach(activity: Activity?) {
            super.onAttach(activity)
            this.lifecycleSubject.onNext(FragmentEvent.ATTACH)
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            this.lifecycleSubject.onNext(FragmentEvent.CREATE)
        }
    }

     

  2. 新建abstract class FragmentationSupportFragment 抽象 Kotlin 类,继承上一步的RxLifecycleMvRxFragment,同时实现 Fragmatation 库的ISupportFragment接口,以解决作者发现的 Fragment 的若干个 BUG。根据库作者建议,可全盘照抄他采用代理模式SupportFragmentDelegate相关 override生命周期的操作代码和他封装的有关 Fragment 的栈操作公共方法。又因 Kotlin 的默认参数值的语法糖,可以进一步简化原 Java 代码的重载方法为一个方法。
    abstract class FragmentationSupportFragment : RxLifecycleMvRxFragment(), ISupportFragment {
        private val mDelegate by lazy { SupportFragmentDelegate(this) }
        private lateinit var mInnerActivity: FragmentActivity
    
        /**
         * 作为当前实例中的 fragmentManager 统一管理 fragment 的容器 containerId
         */
        abstract fun getContextViewId(): Int
    
        override fun getSupportDelegate(): SupportFragmentDelegate {
            return mDelegate
        }
    
        /**
         * Perform some extra transactions.
         * 额外的事务:自定义Tag,添加SharedElement动画,操作非回退栈Fragment
         */
        override fun extraTransaction(): ExtraTransaction {
            return mDelegate.extraTransaction()
        }
    
        override fun onAttach(activity: Activity?) {
            super.onAttach(activity)
            mDelegate.onAttach(activity!!)
            mInnerActivity = mDelegate.activity
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            mDelegate.onCreate(savedInstanceState)
        }
    }

     

  3. 在上述FragmentationSupportFragment中新增一个抽象方法abstract fun getContextViewId(): Int供在最后的实现类中 override,本方法需要返回一个正数值(通常该数值配置成 Fragament 的 xml layout 的 R.id),作用是作为当前实例中的 fragmentManager 统一管理 fragment 的容器 containerId。在 Fragmataion 中封装的栈管理方法中也多处使用了该方法的返回值。
  4. 新建abstract classSwipeBackSupportFragment抽象 Kotlin 类,继承上一步的FragmentationSupportFragment,同时实现 Fragmatation 库的ISwipeBackFragment接口,以实现 Fragment 的手势滑动退出功能,增强用户体验。根据库作者建议,可全盘照抄他的SwipeBackSupprtFragment 中的处理代码,方便在最终的实例子类中调用或者 override调整功能。同样该功能也是采用代理模式编程,所有操作委托给SwipeBackFragmentDelegate的 API 函数,降低对Fragment 原有代码的入侵,让集成更为简洁。代码示例:
    abstract class SwipeBackSupportFragment : FragmentationSupportFragment(), ISwipeBackFragment {
        private val mDelegate by lazy { SwipeBackFragmentDelegate(this) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            mDelegate.onCreate(savedInstanceState)
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            mDelegate.onViewCreated(view, savedInstanceState)
        }
    
        override fun attachToSwipeBack(view: View): View {
            return mDelegate.attachToSwipeBack(view)
        }
    }

下面介绍一下 BaseActivity 一步步的封装过程:

与最终封装 BaseFragment 前类似,我们也需要封装集成 RxLifeCycle 到自定义的 Activity 中,还有FragmatationSupport,SwipeBack 的功能,每一步类的封装也同样是采用 mDelegate 代理对象操作。BaseMvRxActivity --> RxLifecycleMvRxActivity --> FragmentationSupportActivity --> SwipeBackSupportActivity.在此不贴出详细的过程,可参见本文对应的 GitHub 工程库

下一篇文章介绍最终 BaseFragment和 BaseActivity 的封装。

后续《献给android原生应用层开发初学者技术架构选型和整合的方案思路(五)

 

标签:封装,savedInstanceState,fun,初学者,override,mDelegate,android,onCreate,应用层
来源: https://blog.csdn.net/zuoluoq/article/details/88665243

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有