在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)。
00
相似问题