运行 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上找到仓库,关注HomeFragment
和MainActivity
https://github.com/gandarain/money_track_app
我怀疑函数 calculateIncome()
不是 suspend
,它正在阻塞当前线程(主线程)。
在 CashFlowDao
中将 calculateIncome()
函数标记为 suspend
应该可以解决问题。它不会阻塞主线程。
在CashFlowDao
class:
suspend fun calculateIncome(...): Int
我有一个 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上找到仓库,关注HomeFragment
和MainActivity
https://github.com/gandarain/money_track_app
我怀疑函数 calculateIncome()
不是 suspend
,它正在阻塞当前线程(主线程)。
在 CashFlowDao
中将 calculateIncome()
函数标记为 suspend
应该可以解决问题。它不会阻塞主线程。
在CashFlowDao
class:
suspend fun calculateIncome(...): Int