运行 Fragment 上的多生命周期作用域

Run Multi lifecycleScope on Fragment

我有一个 Home 片段,在那个 onCreateView 片段中,我有 2 个函数,将执行 lifecycleScope.

第一个lifecycleScope将用于获取cashFlow的所有列表,第二个lifecycleScope将用于获取outcome和[=的所有总数20=].

这是onCreateView

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val content = inflater.inflate(R.layout.fragment_home, container, false) as ConstraintLayout
    btnNewOutcome(content)
    btnNewIncome(content)

    val cashFlowDao = (activity?.applicationContext as CashFlowApp).db.cashFlowDao()
    loadCashFlow(cashFlowDao, content)
    loadTotalTransaction(cashFlowDao, content)
    return content
}

这是第一个 lifecycleScope,将用于获取所有 cashFlow 历史记录,

private fun loadCashFlow(cashFlowDao: CashFlowDao, content: View) {
    lifecycleScope.launch {
        cashFlowDao.fetchAllCashFlow().collect {
            val cashFlowList = ArrayList(it)
            setupHistoryCashFlow(cashFlowList, cashFlowDao, content)
        }
    }
}

这是第二个 lifecycleScope,将用于获取 cashFlow

的总数
private fun loadTotalTransaction(cashFlowDao: CashFlowDao, content: View) {
    lifecycleScope.launch {
        val totalIncome: Int = cashFlowDao.calculateIncome(Constant.INCOME)
        val totalOutcome: Int = cashFlowDao.calculateIncome(Constant.OUTCOME)
        Log.e("Total", totalIncome.toString())
        setupTotalTransaction(totalIncome, totalOutcome, content)
    }
}

尝试 运行 应用程序时,它会崩溃并显示此错误消息。

你可以在这个link上找到仓库,关注HomeFragmentMainActivity https://github.com/gandarain/money_track_app

我怀疑函数 calculateIncome() 不是 suspend,它正在阻塞当前线程(主线程)。 在 CashFlowDao 中将 calculateIncome() 函数标记为 suspend 应该可以解决问题。它不会阻塞主线程。

CashFlowDao class:

suspend fun calculateIncome(...): Int