在activity的生命周期启动协程

来源:7-13 在 Android 中使用协程

摇滚程序猿

2021-04-08

在activity的生命周期启动协程,比如onstart等方法中调用 job.join等方法需要suspend修饰,类似这样override suspend fun onStart() ,但是编译器会报错,这种需要怎么处理呢?

override suspend fun onStart() {//这一行会报错 ,编译通不过
    super.onStart()
    getPlanTrainData()

}
 //初始化参数
    private suspend fun getPlanTrainData() {
        job = mainScope.launch() {
            httpRequest(apiStores.getTrainResult(class_id.toString()), { it1 ->
                DialogUtils.CloseProDialog()
                if (it1 != null) {

                    planTrainBean = it1
                    shareUrl = it1.shareDetail.shareUrl
                    shareTitle = it1.shareDetail.shareTitle
                    shareDesc = it1.shareDetail.shareDesc
                    shareImage = it1.shareDetail.shareImage
                    isLocked = it1.course_is_unclock
                    isBasicClass = it1.is_minimba_basic
                    coll_layout.title = it1.name
                    toolbarTitleTv.text = it1.name
                    if (it1.score_has_new == 1) {
                        iv_red_score.visibility = View.VISIBLE
                    } else {
                        iv_red_score.visibility = View.GONE
                    }
                    var has_check = it1.has_check
                    if (has_check == 0) {
                        //展示入学通知书
                        var isOpen = this@PlanClassLessonV2Activity.getStringFromLocalSharedPreferences(AddmissionDialogIsOpen)
                        if (isOpen.isNullOrEmpty()) { //当前页面没有弹出过就弹,当前页面弹过了就不弹出了
                            shareAdmissionDialog()
                        }
                    }
                    //测评入口
                    initTestEntrance(it1)
                    //获取主修课程数据
                    mMajorCourseItems.clear()
                    if (it1.focus_course.isNotEmpty()) {
                        mMajorCourseItems.addAll(it1.focus_course)
                    }
                    if (mMajorCourseItems.size == 0) {
                        tv_major.visibility = View.GONE
                    }
                    mRecyclerView1.adapter!!.notifyDataSetChanged()

                    //获取课程列表数据
                    mCourseItems.clear()
                    for (i in 0..it1!!.course_data.lastIndex) {
                        mCourseItems.addAll(it1!!.course_data.get(i).items)
                    }
                    //循环得到 当前正在学习的位置
                    for (i in 0..mCourseItems.lastIndex) {
                        if (mCourseItems[i].is_last_study == 1) {
                            CoursePosition = i
                            isHasStudy = true //存在学习记录
                        }
                    }
                    if (mCourseItems[CoursePosition].is_unclock == 1) { //如果大于零则存在学习记录 否则为初始值 -1 不展开
                        mCourseItems[CoursePosition].isExpend = true
                    }
                    if (mCourseItems.isNotEmpty() && mCourseItems.size < 4) {
                        ll_recy.minimumHeight = 1920
                    } else {
                        ll_recy.minimumHeight = 0
                    }
                    mRecyclerView.adapter!!.notifyDataSetChanged()
                    //初始化按钮状态
                    if (isLocked == 0) {
                        tv_locate_last_Study.text = "课程即将解锁"
                        tv_locate_last_Study.setTextColor(Color.parseColor("#B2B2B2"))
                        tv_locate_last_Study.setBackgroundResource(R.drawable.shape_round_bg_eeeeee)
                    } else {
                        tv_locate_last_Study.setBackgroundResource(R.drawable.shape_bg_e9d3a6)
                        tv_locate_last_Study.setTextColor(Color.parseColor("#654F2F"))
                        if (isHasStudy) {
                            tv_locate_last_Study.text = "定位上次学习"
                        } else {
                            tv_locate_last_Study.text = "立即开始学习"
                        }
                    }
                }
                refreshLayoutSR.isRefreshing = false
            }, {
                DialogUtils.CloseProDialog()
                refreshLayoutSR.isRefreshing = false
            })
        }
        job?.join()
        //前面一个网络请求完成后执行后面的的网络请求
       mainScope.launch {
            planTrainBean?.let {
                sharePostPresenterImp?.getSharePostData(it.plan_id.toString())
            }
        }
    }
写回答

1回答

bennyhuo

2021-09-27

suspend 函数与普通函数是不一样的,你当然不能随便的修改 onStart 为 suspend。如果想要 join,你需要启动一个协程,然后在里面调用其他 suspend 方法(例如 join)。

0
0

Android首选开发语言Kotlin入门与进阶

Google I/O大会钦定Android一级开发语言,现在不学,等待何时

3122 学习 · 387 问题

查看课程