续前篇《献给android原生应用层开发初学者技术架构选型和整合的方案思路(三)》
本构架采用的 多Activity + 多 Fragments 开发模块,所以以下先介绍BaseFragment 一步步封装的过程。
以下的成品代码可见本人放在 GitHub 上的项目。
-
新建一个 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) } }
- 新建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) } }
- 在上述FragmentationSupportFragment中新增一个抽象方法abstract fun getContextViewId(): Int供在最后的实现类中 override,本方法需要返回一个正数值(通常该数值配置成 Fragament 的 xml layout 的 R.id),作用是作为当前实例中的 fragmentManager 统一管理 fragment 的容器 containerId。在 Fragmataion 中封装的栈管理方法中也多处使用了该方法的返回值。
- 新建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原生应用层开发初学者技术架构选型和整合的方案思路(五)》