首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳过CoroutineScope

跳过CoroutineScope
EN

Stack Overflow用户
提问于 2022-02-03 20:27:27
回答 1查看 49关注 0票数 0

为了更好的解释,我的CoroutineScope刚刚停止工作,但是没有什么关键的改变,错误也没有出现。程序跳过它,我的进度条保持不变。你知道是什么导致了这个问题吗?

代码语言:javascript
复制
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()
    }
EN

回答 1

Stack Overflow用户

发布于 2022-02-03 20:57:38

如果您使用的是协同线,那么发布可运行项是没有意义的。协同机制存在的一半原因是为了避免这种混乱的嵌套回调。我在你们的协作中也看到了一些错误:

  • 在Dispatchers.IO上运行,尽管它从来不做任何阻塞操作。
  • 运行在一个从未被取消的丢弃CoroutineScope上。如果不立即将CoroutineScope()构造函数分配给一个变量或属性,您就不应该使用它,通过它,您可以在适当的时候取消它。您应该使用viewLifeCycleOwner.lifecycleScope,因为它已经设置为在适当的时间自动取消以避免崩溃。
  • 您正在发布的可运行项不会在适当的时间被取消,所以即使您使用了适当的范围,它们仍然可能导致崩溃。但是如前所述,即使coroutine.
  • (mAdapter?.itemCount != 0)为null,在mAdapter!!.

中也不需要它们,即使mAdapter为null,mAdapter也会计算为真,这会在使用mAdapter!!.时立即导致崩溃。

固定代码看起来是这样的。如果仍然没有执行任何操作,则需要进行检查,以确保适配器在调用时不为空。

代码语言:javascript
复制
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()
}

我没有试图遵循您关于这些todayEventsCounttodayCheckedEventsCount属性的逻辑。它们可能应该是协同线中本地定义的变量。

在while循环中,您还需要一些条件才能使您脱离它。我看得不够仔细,看不出那应该是什么情况。您的原始代码不会永远中断重新发布可运行代码的循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70977855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档