Kotlin中如何将try catch移至ActivityResult扩展函数侧消除样板代码
问题修正
你当前编写的版本存在三处问题:
- 遗漏了原有逻辑中
resultCode == Activity.RESULT_OK的前置校验,和旧版本行为不统一 - 函数名存在拼写错误,
Execture应为Execute - 同一个回调会被触发两次:无异常时传null调用一次,捕获异常后又传异常调用一次,不符合常规回调逻辑
正确实现方案
方案1:沿用你设计的单回调参数思路修正
保留异常作为回调参数传递的逻辑,修复上述问题后的实现如下:
inline fun ActivityResult.newCheckResultAndExecute(block: ActivityResult.(Exception?) -> Unit) { if (resultCode != Activity.RESULT_OK) { Timber.e("FrameworkUtils: Something went wrong on Registering a ActivityResult") // 若需要将resultCode错误也作为异常回传,可在此处调用block(ActivityResultException("Result not ok")) return } try { block(null) } catch (e: Exception) { block(e) } }
调用侧代码:
result.newCheckResultAndExecute { e -> // 异常分支处理 e?.let { toast("Error") return@newCheckResultAndExecute } // 正常业务逻辑 val task = GoogleSignIn.getSignedInAccountFromIntent(data) val account = task.getResult(ApiException::class.java) loginViewModel.onEvent(LoginRegistrationEvent.SignInWithGoogle(account)) }
方案2:拆分成功/失败回调(更推荐)
将正常业务逻辑和异常处理拆分为两个独立回调,调用侧不需要做空判断,可读性更高:
inline fun ActivityResult.checkResultAndExecute( crossinline onError: (Exception) -> Unit, crossinline onSuccess: ActivityResult.() -> Unit ) { if (resultCode != Activity.RESULT_OK) { Timber.e("FrameworkUtils: Something went wrong on Registering a ActivityResult") return } try { onSuccess() } catch (e: Exception) { onError(e) } }
调用侧代码:
result.checkResultAndExecute( onError = { toast("Error") } ) { val task = GoogleSignIn.getSignedInAccountFromIntent(data) val account = task.getResult(ApiException::class.java) loginViewModel.onEvent(LoginRegistrationEvent.SignInWithGoogle(account)) }
内容的提问来源于stack exchange,提问作者Andrew。
相关产品推荐
相关产品推荐

