为了更好的解释,我的CoroutineScope刚刚停止工作,但是没有什么关键的改变,错误也没有出现。程序跳过它,我的进度条保持不变。你知道是什么导致了这个问题吗?
class HomeFragment : BaseFragment(R.layout.fragment_home) {
private var todayEventsCount: Int = 0
private var todayCheckedEventsCount: Int = 0
private val mHandler = Handler()
private var mAdapter: FirebaseRecyclerAdapter<EventModel, EventsHolder>? = null
private lateinit var mRunnable: Runnable
private lateinit var barList: ArrayList<BarEntry>
private lateinit var barDataSet: BarDataSet
private lateinit var barData: BarData
override fun onResume() {
super.onResume()
initFields()
}
override fun onPause() {
super.onPause()
home_events_list.removeAllViewsInLayout()
todayCheckedEventsCount = 0
}
@SuppressLint("SetTextI18n")
private fun initFields() {
val progress: ProgressBar = ev_progress_bar
val text: TextView = count
getTodayEvents()
CoroutineScope(Dispatchers.IO).launch {
mRunnable = Runnable {
if (mAdapter?.itemCount != 0) {
todayEventsCount = mAdapter?.itemCount!!
for (i in 0 until todayEventsCount) {
if (mAdapter?.getItem(i)!!.checked == "1") {
todayCheckedEventsCount++
progress.progress = todayCheckedEventsCount
text.text = progress.progress.toString() + "/" + progress.max.toString()
}
}
todayCheckedEventsCount = 0
}
mHandler.postDelayed(mRunnable, 30)
}
mHandler.post(mRunnable)
}
initChart()
}发布于 2022-02-03 20:57:38
如果您使用的是协同线,那么发布可运行项是没有意义的。协同机制存在的一半原因是为了避免这种混乱的嵌套回调。我在你们的协作中也看到了一些错误:
CoroutineScope()构造函数分配给一个变量或属性,您就不应该使用它,通过它,您可以在适当的时候取消它。您应该使用viewLifeCycleOwner.lifecycleScope,因为它已经设置为在适当的时间自动取消以避免崩溃。(mAdapter?.itemCount != 0)为null,在mAdapter!!.中也不需要它们,即使mAdapter为null,mAdapter也会计算为真,这会在使用mAdapter!!.时立即导致崩溃。
固定代码看起来是这样的。如果仍然没有执行任何操作,则需要进行检查,以确保适配器在调用时不为空。
private fun initFields() {
val progress: ProgressBar = ev_progress_bar
val text: TextView = count
getTodayEvents()
viewLifeCycleOwner.lifecycleScope.launch {
val adapter = mAdapter ?: return
while (true) {
if (adapter.itemCount != 0) {
todayEventsCount = adapter.itemCount
for (i in 0 until todayEventsCount) {
if (adapter.getItem(i).checked == "1") {
todayCheckedEventsCount++
progress.progress = todayCheckedEventsCount
text.text = progress.progress.toString() + "/" + progress.max.toString()
}
}
todayCheckedEventsCount = 0
}
delay(30)
}
}
initChart()
}我没有试图遵循您关于这些todayEventsCount和todayCheckedEventsCount属性的逻辑。它们可能应该是协同线中本地定义的变量。
在while循环中,您还需要一些条件才能使您脱离它。我看得不够仔细,看不出那应该是什么情况。您的原始代码不会永远中断重新发布可运行代码的循环。
https://stackoverflow.com/questions/70977855
复制相似问题