续前篇《献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)》
本篇着重于 BaseFragment,BaseActivity 一步步的封装和网络访问组件的封装,ViewModel 的封装等等,通过一步步的封装与继承实现通用的 BaseFragment/BaseActivity 类使其具有MvRx带来的 MVVM架构响应式函数编程, LifeCycleWare 生命周期感知从而可以解决 RxJava 的内存泄露,Fragmatation组件修复的 Fragment 的 bug处理及动画跳转,以及SwipeBack 手势滑动退出的通用功能,具体的使用可能到具体的实现类中进一步处理。
封装 RootApplication根上下文类,Kotlin 语言。
1)首先继承MultiDexApplication类以解决64k 方法数限制的问题。 调用MultiDex.install(this)以启用
2)启用LeakCanary内存泄露检测库中的RefWatcher方便后续在 BaseFragment 等类中进行封装调用,值得注意的是 buidl.gradle中有不同编译条件下启用的库组件,方便只在 debug模式下启用内存检测功能,而在 release 模式下功能禁用而不需要开发者修改或者删除任何已有的代码。在 companion object伴生对象中封装一个静态方法getRefWatcher(context: Context)供后续全局使用。
3)在 onCreate()中init 初始化AliBaba 的 ARouter 路由组件,并在 debug 模式下打开 ARouter 的 log 和 debug 功能开关
4)在 onCreate()中init 几个常用到的工具类以挂载到全局上下文,如 AndroidUtilCode,RxTools,开启 Debug模式下启用 Fragmentation 的栈查看器代码等等。当然这些是您的可选项,非必须组件。大致代码如下:
class RootApplication : MultiDexApplication() {
private lateinit var refWatcher: RefWatcher
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
MultiDex.install(this)
}
override fun onCreate() {
super.onCreate()
refWatcher = setupLeakCanary()
if (BuildConfig.DEBUG) {
ARouter.openLog()
ARouter.openDebug()
}
ARouter.init(this)
Utils.init(this)
RxTool.init(this)
startUpFragmentStackBubble(this)
}
//安装内存检测
//在 activity ,fragment 等组件的onDestroy中使用如下代码调用 watcher
// RefWatcher refWatcher = RootApplication.getRefWatcher(getActivity());
// refWatcher.watch(this)
private fun setupLeakCanary(): RefWatcher {
if (LeakCanary.isInAnalyzerProcess(this)) {
return RefWatcher.DISABLED
}
return LeakCanary.install(this)
}
/**
* 开启fragment 悬浮球栈视图功能,仅调试模式下启用
*/
private fun startUpFragmentStackBubble(context: Context) {
// 栈视图等功能,建议在Application里初始化
if (BuildConfig.DEBUG) {
Fragmentation.builder()
// 显示悬浮球 ; 其他Mode:SHAKE: 摇一摇唤出 NONE:隐藏
.stackViewMode(Fragmentation.BUBBLE)
.debug(BuildConfig.DEBUG)
.handleException {
Toast.makeText(context, it.message, Toast.LENGTH_SHORT).show()
}
.install()
}
}
companion object {
fun getRefWatcher(context: Context): RefWatcher {
val leakApplication = context.applicationContext as RootApplication
return leakApplication.refWatcher
}
}
}
其中BuildConfig.DEBUG变量刚开始不存在,IDE报错,您需要在 gradle中双击 build 以生成此条件代码,当Build Variant中的模块为debug 时,此变量值为 true.您在 import 多个 BuildConfig.DEBUG 时请留心要引用当前项目 package 下的文件,因为依赖的 lib 包中也有很多有同名的BuildConfig.DEBUG。这是个坑。
5)在AndroidManifest.xml文件中的<application>节点添加 android:name=".general.core.RootApplication"以使用您自定义的根上下文,如果您的 manifest 文件在<manifest>节点定义了如package="com.demo.mvvm",那此 xml 文件中的所有引用类可以只填写相对路径。
6)要看下 模块的 build.gradle 中的multiDexEnabled true有没有启用,没有的话要添加此开关为 true,这样才可以解决64k 方法数的问题。