Android Kotlin中Amplify查询DynamoDB无结果问题排查求助
Android Amplify DataStore查询无执行无结果问题分析
问题场景
在Android应用中使用Kotlin通过Amplify查询DynamoDB数据,代码逻辑看似正常,但运行时查询回调未触发,无任何返回结果,查阅Amplify官方文档未找到原因。
相关代码
fun getUserData(email: String) { println("We will get the userdata!!!!!!!!") Amplify.DataStore.query( User::class.java, { items -> while (items.hasNext()) { val item = items.next() Log.i("Amplify", "Queried item: " + item.name) } }, { failure -> Log.e("Tutorial", "Could not query DataStore", failure) } ) }
翻译后的运行日志
2023-04-21 19:41:19.981 16806-16893 TrafficStats com.example.aupairconnect D 标记Socket(119),statsTag=0xffffffff,statsUid=-1 2023-04-21 19:41:20.011 16806-16806 兼容性变更报告器 com.example.aupairconnect D 已上报兼容变更ID:171228096;UID 10162;状态:已启用 2023-04-21 19:41:20.211 16806-16881 amplify:aws-datastore com.example.aupairconnect I 协调器锁已释放。 2023-04-21 19:41:20.211 16806-16881 MyAmplifyApp com.example.aupairconnect I DataStore已启动 2023-04-21 19:41:20.531 16806-16887 e.aupairconnect com.example.aupairconnect W 长时间监视器竞争,所有者为pool-5-thread-1 (16886),位于void com.amplifyframework.api.aws.SubscriptionEndpoint.requestSubscription(com.amplifyframework.api.graphql.GraphQLRequest, com.amplifyframework.api.aws.AuthorizationType, com.amplifyframework.core.Consumer, com.amplifyframework.core.Consumer, com.amplifyframework.core.Consumer, com.amplifyframework.core.Action)(SubscriptionEndpoint.java:196),等待者数=0,持续时间562ms 2023-04-21 19:41:20.666 16806-16888 e.aupairconnect com.example.aupairconnect W 长时间监视器竞争,所有者为pool-5-thread-1 (16886),位于void com.amplifyframework.api.aws.SubscriptionEndpoint.requestSubscription(com.amplifyframework.api.graphql.GraphQLRequest, com.amplifyframework.api.aws.AuthorizationType, com.amplifyframework.core.Consumer, com.amplifyframework.core.Consumer, com.amplifyframework.core.Consumer, com.amplifyframework.core.Action)(SubscriptionEndpoint.java:196),等待者数=1,持续时间695ms 2023-04-21 19:41:20.793 16806-16880 amplify:aws-datastore com.example.aupairconnect I 已启动针对模型[User]的订阅处理器,类型为[ON_CREATE, ON_UPDATE, ON_DELETE]。 2023-04-21 19:41:20.801 16806-16893 TrafficStats com.example.aupairconnect D 标记Socket(120),statsTag=0xffffffff,statsUid=-1 2023-04-21 19:41:20.975 16806-16860 EGL_emulation com.example.aupairconnect D app_time_stats: 平均值=73.29ms 最小值=0.58ms 最大值=656.79ms 计数=17 2023-04-21 19:41:21.041 16806-16806 OnBackInvokedCallback com.example.aupairconnect W 应用未启用OnBackInvokedCallback。请在应用清单中设置'android:enableOnBackInvokedCallback="true"'。 2023-04-21 19:41:21.060 16806-16904 amplify:aws-datastore com.example.aupairconnect I 已成功从云端同步模型状态。 2023-04-21 19:41:21.061 16806-16880 amplify:aws-datastore com.example.aupairconnect I 开始处理订阅数据缓冲区。 2023-04-21 19:41:21.061 16806-16880 amplify:aws-datastore com.example.aupairconnect I 已在API同步模式下启动协调器。 2023-04-21 19:41:21.061 16806-16879 amplify:aws-datastore com.example.aupairconnect I 开始处理突变待处理队列。待处理突变将发布到云端。 2023-04-21 19:41:21.068 16806-16806 System.out com.example.aupairconnect I We will get the userdata!!!!!!!! 2023-04-21 19:41:21.068 16806-16806 amplify:aws-datastore com.example.aupairconnect I 已获取协调器锁。 2023-04-21 19:41:21.068 16806-16885 amplify:aws-datastore com.example.aupairconnect I DataStore插件已初始化。 2023-04-21 19:41:21.074 16806-16806 System.out com.example.aupairconnect I We will get the userdata!!!!!!!! 2023-04-21 19:41:21.321 16806-16885 amplify:aws-datastore com.example.aupairconnect I 协调器锁已释放。 2023-04-21 19:41:21.321 16806-16806 amplify:aws-datastore com.example.aupairconnect I 已获取协调器锁。 2023-04-21 19:41:21.322 16806-16882 amplify:aws-datastore com.example.aupairconnect I DataStore插件已初始化。 2023-04-21 19:41:21.575 16806-16882 amplify:aws-datastore com.example.aupairconnect I 协调器锁已释放。 2023-04-21 19:41:24.656 16806-16911 ProfileInstaller com.example.aupairconnect D 正在为com.example.aupairconnect安装配置文件
原因分析
- DataStore未完全初始化:日志显示
getUserData被调用时,DataStore插件仍在初始化过程中(后续出现两次"DataStore插件已初始化"),此时查询请求可能被阻塞或丢弃,无法触发回调。 - 重复初始化DataStore:日志中出现两次"DataStore插件已初始化",说明可能重复执行了Amplify/DataStore的初始化操作,导致插件状态异常,影响查询逻辑。
- 锁竞争阻塞:日志中有"长时间监视器竞争"的警告,DataStore的协调器锁被长时间占用,可能导致查询线程无法获取锁,无法执行查询逻辑。
解决方案
- 等待DataStore就绪后再查询:监听DataStore的就绪状态,确认初始化完成后执行查询:
Amplify.DataStore.ready() .observeForever { getUserData("目标邮箱") }
- 避免重复初始化:确保Amplify初始化代码只执行一次,比如放在Application的
onCreate方法中,不要在多个页面或多次调用中重复初始化。 - 排查锁竞争:检查应用中是否有其他长时间占用DataStore资源的操作(如批量同步、大量数据写入),优化这些操作的执行时机,避免与查询操作冲突。
- 增强调试日志:在查询回调中添加更明确的日志输出,确认回调是否被触发:
Amplify.DataStore.query( User::class.java, { items -> Log.i("Amplify", "查询回调开始执行") while (items.hasNext()) { val item = items.next() Log.i("Amplify", "查询到数据: " + item.name) } Log.i("Amplify", "查询回调执行结束") }, { failure -> Log.e("Tutorial", "查询失败", failure) } )
内容的提问来源于stack exchange,提问作者Jonathon Vega
相关产品推荐
相关产品推荐

