You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:05:42