当前方案: AppInitializer 需要分两步调用
init(application) - 注册生命周期监听setCallbacks(...) - 设置回调函数用户疑问: 为什么不能由 SocketIOManager 内部统一处理?为什么需要外部分步设置?
// AppInitializer.kt
val initMethod = socketIOManagerClass.getMethod("init", Application::class.java)
initMethod.invoke(null, application)
val setCallbacksMethod = socketIOManagerClass.getMethod("setCallbacks", ...)
setCallbacksMethod.invoke(null, isLoggedInProvider, refreshTokenProvider)
问题:
思路: SocketIOManager 提供一个统一的初始化方法,内部处理所有逻辑
// SocketIOManager.kt
fun init(app: Application) {
// 只注册生命周期监听
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
override fun onStart(owner: LifecycleOwner) {
// 延迟初始化:在第一次 onStart 时检查回调是否设置
if (isLoggedInProvider == null || refreshTokenProvider == null) {
ILog.w(TAG, "回调函数未设置,跳过 SocketIO 重连")
return
}
// ... 重连逻辑
}
优点:
init()缺点:
// SocketIOManager.kt
fun init(app: Application) {
// 注册生命周期监听
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
// 提供一个方法,让外部通过反射设置回调
// 这个方法不需要参数,因为回调已经存储为属性
fun ensureCallbacksSet() {
// 检查回调是否设置,如果没有设置则记录警告
if (isLoggedInProvider == null) {
ILog.w(TAG, "登录状态检查回调未设置")
}
if (refreshTokenProvider == null) {
ILog.w(TAG, "Token 刷新回调未设置")
}
}
AppInitializer 中:
// 1. 调用 init
val initMethod = socketIOManagerClass.getMethod("init", Application::class.java)
initMethod.invoke(null, application)
// 2. 直接设置属性(不需要调用 setCallbacks)
val isLoggedInProviderField = socketIOManagerClass.getDeclaredField("isLoggedInProvider")
isLoggedInProviderField.isAccessible = true
isLoggedInProviderField.set(null, isLoggedInProvider)
val refreshTokenProviderField = socketIOManagerClass.getDeclaredField("refreshTokenProvider")
refreshTokenProviderField.isAccessible = true
refreshTokenProviderField.set(null, refreshTokenProvider)
优点:
init()(注册生命周期)缺点:
// SocketIOManager.kt
fun init(app: Application) {
// 内部尝试获取回调(通过反射或其他方式)
// 但问题是:能力层不能依赖业务层,无法直接获取 AuthManager
}
问题:
理由:
实现:
init() 只负责注册生命周期监听public 或通过反射直接设置当前方案(方案3:setCallbacks)的问题:
SuspendFunction0 类型改进方案(方案B2:直接设置属性):
权衡: