通过动态代理去掉接口强制实现的方法

63 阅读1分钟
/**
 * 必须实现空方法,否则会报错
 */
private fun registerNormalLifecycle(){
    val activityLifecycleCallback:ActivityLifecycleCallbacks = object : ActivityLifecycleCallbacks{
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            activeActivities.add(activity)
        }

        override fun onActivityStarted(activity: Activity) {
            TODO("Not yet implemented")
        }

        override fun onActivityResumed(activity: Activity) {
            TODO("Not yet implemented")
        }

        override fun onActivityPaused(activity: Activity) {
            TODO("Not yet implemented")
        }

        override fun onActivityStopped(activity: Activity) {
            TODO("Not yet implemented")
        }

        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
            TODO("Not yet implemented")
        }

        override fun onActivityDestroyed(activity: Activity) {
            activeActivities.remove(activity)
        }
    }
}

参考LeakCannary源码,通过Java动态代理和kotlin委托来实现,根据需要实现方法。

private val NO_OP_HANDLER = InvocationHandler { _, _, _ ->
    // no op
}

/**
 * Java动态代理,运行时生成了一个实现对应接口的对象,对象方法实现的InvocationHandler是一个空实现。
 */
internal inline fun <reified T : Any> noOpDelegate(): T {
    val javaClass = T::class.java
    return Proxy.newProxyInstance(
        javaClass.classLoader, arrayOf(javaClass), NO_OP_HANDLER
    ) as T
}

private val activeActivities: ArrayList<Activity> = ArrayList()

/**
 * 根据需要实现的接口,生成对应的代理对象,然后在代理对象中实现空方法。
 * 去掉ActivityLifecycleCallbacks中不需要的空实现--》kotlin代理/委托实现
 */
private val activityLifecycleCallback: ActivityLifecycleCallbacks = object : ActivityLifecycleCallbacks by noOpDelegate() {
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        activeActivities.add(activity)
    }
    override fun onActivityDestroyed(activity: Activity) {
        activeActivities.remove(activity)
    }
}

当然一般我们想到的方案是通过抽象类实现简化,例如Google例子:AnimatorListenerAdapter