如何解决退出活动时协程作业是否自动取消?
我有以下缓慢加载图像的代码
class MainActivity : AppCompatActivity() {
private lateinit var job: Job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val imageLoader = ImageLoader.Builder(this)
.componentRegistry { add(SvgDecoder(this@MainActivity)) }
.build()
job = MainScope().launch {
try {
val request = ImageRequest.Builder(this@MainActivity)
.data("https://restcountries.eu/data/afg.svg")
.build()
val drawable = imageLoader.execute(request).drawable
Log.d("TrackLog","Loaded")
findViewById<ImageView>(R.id.my_view).setImageDrawable(drawable)
} catch (e: CancellationException) {
Log.d("TrackLog","Cancelled job")
}
}
}
override fun onDestroy() {
super.onDestroy()
// job.cancel()
}
}
如果我在图像加载完成之前退出 Activity,我想我应该手动执行 job.cancel()
来取消协程。
但是,即使我注释掉了 job.cancel()
,当我退出 MainActivity
时作业仍然会被取消。
当我使用 GlobalScope
或什至使用全局变量范围和作业时也是如此。
val myScope = CoroutineScope(Dispatchers.IO)
private lateinit var job: Job
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val imageLoader = ImageLoader.Builder(this)
.componentRegistry { add(SvgDecoder(this@MainActivity)) }
.build()
job = myScope.launch {
try {
val request = ImageRequest.Builder(this@MainActivity)
.data("https://restcountries.eu/data/afg.svg")
.build()
val drawable = imageLoader.execute(request).drawable
Log.d("TrackLog","Cancelled job")
}
}
}
override fun onDestroy() {
super.onDestroy()
// job.cancel()
}
}
我很困惑,即使我没有调用 job.cancel()
,当我们退出 Activity 时,作业是如何被取消的。
解决方法
显然,因为我的 request
是由 this@MainActivity
val request = ImageRequest.Builder(this@MainActivity)
.data("https://restcountries.eu/data/afg.svg")
.build()
因此,当退出时,this@MainActivity
被杀死,因此 request
也被终止并可能被取消?
如果我们使用 baseContext
val request = ImageRequest.Builder(baseContext)
.data("https://restcountries.eu/data/afg.svg")
.build()
然后我们必须在onDestroy
因此使用 lifecycleScope
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。