热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Androidjava.lang.IllegalStateException:必须在主线程上调用方法addObserver

尝试访问视图模型时抛出异常。异常抱怨调用 addObserver,但我在代码路径中没有看到任何可能调用 addObserver Fragment 的内容@AndroidEntryPointclass

尝试访问视图模型时抛出异常。异常抱怨调用 addObserver,但我在代码路径中没有看到任何可能调用 addObserver Fragment 的内容

@AndroidEntryPoint
class ReferralEntryDialogFragment : DialogFragment() {
private val viewModel: ReferralEntryViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.applyCodeButton.setOnClickListener {
GlobalScope.launch {
try {
// Exception is thrown as soon as viewModel is accesses
// It does not get to applyCode function
viewModel.applyCode("code)
} catch (e: Exception) { }
}
}
}
}

视图模型

@HiltViewModel
class ReferralEntryViewModel @Inject constructor() : ViewModel() {
suspend fun applyCode(code: String): ApplyReferralResponse {
val result = Firebase.functions.getHttpsCallable("applyReferralCode")
.call(mapOf( "referralCode" to code))
.await()
val map = result?.data as Map
val jsOnString= Gson().toJson(map)
return Gson().fromJson(jsonString, ApplyReferralResponse::class.java)
}
}

堆栈跟踪

result = {StackTraceElement[20]@26993}
0 = {StackTraceElement@26901} "androidx.lifecycle.LifecycleRegistry.enforceMainThreadIfNeeded(LifecycleRegistry.java:317)"
1 = {StackTraceElement@26902} "androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:172)"
2 = {StackTraceElement@26903} "androidx.lifecycle.SavedStateHandleController.attachToLifecycle(SavedStateHandleController.java:49)"
3 = {StackTraceElement@26904} "androidx.lifecycle.SavedStateHandleController.create(SavedStateHandleController.java:70)"
4 = {StackTraceElement@26905} "androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:67)"
5 = {StackTraceElement@26906} "androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:84)"
6 = {StackTraceElement@26907} "dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:107)"
7 = {StackTraceElement@26908} "androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)"
8 = {StackTraceElement@26909} "androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)"
9 = {StackTraceElement@26910} "androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)"
10 = {StackTraceElement@26911} "androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)"
11 = {StackTraceElement@26912} "com.shivaapps.freeloaders.referral.ReferralEntryDialogFragment.getViewModel(Unknown Source:2)"
12 = {StackTraceElement@26913} "com.shivaapps.freeloaders.referral.ReferralEntryDialogFragment.access$getViewModel$p(ReferralEntryDialogFragment.kt:18)"
13 = {StackTraceElement@26914} "com.shivaapps.freeloaders.referral.ReferralEntryDialogFragment$onViewCreated$1$1.invokeSuspend(ReferralEntryDialogFragment.kt:41)"
14 = {StackTraceElement@26915} "kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)"
15 = {StackTraceElement@26916} "kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)"
16 = {StackTraceElement@26917} "kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)"
17 = {StackTraceElement@26918} "kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)"
18 = {StackTraceElement@26919} "kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)"
19 = {StackTraceElement@26920} "kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)"

回答

viewmodel 是在访问时惰性创建的,并且 viewmodel 的创建必须在主线程上完成。只需尝试在主线程上访问视图模型,然后再在全局范围内访问它就可以解决问题

// Access viewmodel so that it gets initialized on the main thread
viewModel
GlobalScope.launch
try {
// Exception is thrown as soon as viewModel is accesses
// It does not get to applyCode function
viewModel.applyCode("code)
} catch (e: Exception) {}
}






推荐阅读
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
洪爷不是我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有