Android协程异常排查:主线程数据库访问与Random参数错误
两个异常的解决方案
1. 解决主线程访问数据库的IllegalStateException
问题原因:asLiveData() 默认使用ViewModelScope的主线程上下文收集Flow,导致Room数据库操作在主线程执行,触发异常。
解决方案:调用asLiveData()时指定IO线程上下文,确保数据库操作在后台执行:
修改WordViewModel.kt的代码:
import kotlinx.coroutines.Dispatchers val allWordAggregate: LiveData<List<WordAggregate>> = wordDao.getWordsWithMeanings().asLiveData(Dispatchers.IO)
2. 解决Random相关的IllegalArgumentException
问题原因:当items为空列表时,it.size为0,调用Random().nextInt(0)会抛出"bound must be positive"异常(nextInt要求参数必须大于0)。
解决方案:先判断列表是否非空,再执行随机逻辑:
修改HomeFragment.kt的代码:
viewModel.allWordAggregate.observe(this.viewLifecycleOwner) { items -> items.takeIf { it.isNotEmpty() }?.let { nonEmptyItems -> try { val randomIndex = Random().nextInt(nonEmptyItems.size) val randomWordAggregate = nonEmptyItems[randomIndex] _randomWordAggregate = randomWordAggregate } catch (e: Exception) { Log.d("FATAL EXCEPTION LOGCAT", e.toString()) } } ?: run { // 可在此处理列表为空的场景,比如提示用户无数据 Log.d("EMPTY LIST", "No word aggregates available") } }
内容的提问来源于stack exchange,提问作者oguzata
相关产品推荐
相关产品推荐

