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

本文详细介绍了一种基于Kotlin的Android应用架构封装方法,重点介绍了BaseFragment和BaseActivity的封装,以及如何通过封装实现MVVM架构和响应式编程。文章还讲解了如何使用RootApplication根上下文类解决64k方法数限制问题,并启用了内存泄露检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

续前篇《献给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 方法数的问题。

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值