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

续前篇《献给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原生应用层开发初学者技术架构选型和整合的方案思路(五)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值