android - 当可调用的firebase函数抛出异常时防止android应用程序崩溃
问题描述
我的 Firebase 可调用函数需要在传递无效值时通知客户端。根据文档,这应该使用functions.https.HttpsError
-
if (!condition) {
throw new functions.https.HttpsError(
'invalid-argument',
'Cheating will incur ban'
);
}
添加客户端代码以调用文档中给出的函数会导致应用程序崩溃。
fun addPlayTime(playTime: Int): Task<String> {
val data = hashMapOf(
"playTime" to playTime
)
return functions
.getHttpsCallable("addPlayTime")
.call(data)
.continueWith { task ->
val result = task.result?.data as String
result
}
}
viewModel.addPlayTime(10000)
.addOnCompleteListener { task ->
Timber.d("API response: ${task.result}")
if (!task.isSuccessful) {
val e = task.exception
if (e is FirebaseFunctionsException) {
val code = e.code
val details = e.details
Timber.d("API call failed: $details")
}
}
}
我可以在 logcat 中看到错误。如何在我的应用程序不崩溃的情况下处理此异常?将上面的代码包装在 try-catch 中并没有帮助。
2020-07-31 19:04:28.722 17502-17502/com.teamvanar.gcharge E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.teamvanar.gcharge, PID: 17502
com.google.android.gms.tasks.RuntimeExecutionException: com.google.firebase.functions.FirebaseFunctionsException: Cheating will incur ban
at com.google.android.gms.tasks.zzu.getResult(Unknown Source:15)
at com.teamvanar.gcharge.MainActivity$onCreate$2.onComplete(MainActivity.kt:67)
at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: com.google.firebase.functions.FirebaseFunctionsException: Cheating will incur ban
解决方案
根据我的经验,Firebase Http CallableCompleteListener
在 Kotlin 中使用时存在一些类型转换(反射?)问题,并且这些 FATAL 无法通过 try-catch 捕获。
在我的情况下替换它SuccessListener
并FailureListener
解决它:
// from this
someFirebaseFunction.addOnCompleteListener { task ->
if (task.isSuccessful) {
task.result?.let { /* do something */ }
} else {
println("Error: ${task.exception}")
}
}
// to this
someFirebaseFunction.addOnSuccessListener { result ->
/* do something */
}.addOnFailureListener { exception ->
println("Error: $exception")
}
}
在您的情况下,这可能有效:
viewModel.addPlayTime(10000).addOnSuccessListener { result ->
Timber.d("API response: $result")
}.addOnFailureListener { e ->
if (e is FirebaseFunctionsException) {
val code = e.code
val details = e.details
Timber.d("API call failed: $details")
}
}
推荐阅读
- jquery - 为什么标头访问控制允许来源不起作用?
- google-apps-script - 如何正确组合 2 个脚本,所以两者都是 onEdit?
- git - Upsource:合并评论在评论摘要中不显示任何内容
- python - AttributeError:模块“discord.client”没有属性“事件”
- python - 将表格刮到excel文件
- python - 对 pandas 数据框进行窗口化操作,以列出与前 n 个条目的欧几里得距离
- java - 如何使用 readAllBytes 将文件中的字节读入单个字符串?
- android - 如何从 Android Studio 中的目录访问模块内的类?
- php - Wordpress wp-cron.php 执行不起作用
- node.js - 使用 dio 错误从 Flutter 获取到节点 js 的请求