【发布时间】:2019-08-08 01:50:23
【问题描述】:
AsyncTask 的典型用途:我想在另一个线程中运行一个任务,完成该任务后,我想在我的 UI 线程中执行一些操作,即隐藏一个进度条。
任务将在TextureView.SurfaceTextureListener.onSurfaceTextureAvailable 开始,完成后我想隐藏进度条。同步执行此操作不起作用,因为它会阻止构建 UI 的线程,使屏幕变黑,甚至不显示我之后想要隐藏的进度条。
到目前为止,我使用这个:
inner class MyTask : AsyncTask<ProgressBar, Void, ProgressBar>() {
override fun doInBackground(vararg params: ProgressBar?) : ProgressBar {
// do async
return params[0]!!
}
override fun onPostExecute(result: ProgressBar?) {
super.onPostExecute(result)
result?.visibility = View.GONE
}
}
但是这些课程非常丑陋,所以我想摆脱它们。 我想用 kotlin 协程来做到这一点。我尝试了一些变体,但它们似乎都不起作用。我最有可能怀疑的工作是这样的:
runBlocking {
// do async
}
progressBar.visibility = View.GONE
但这不能正常工作。据我了解,runBlocking 不会像AsyncTask 那样启动新线程,这就是我需要它做的事情。但是使用thread 协程,我看不到一种合理的方式来在它完成时得到通知。另外,我也不能把progressBar.visibility = View.GONE放到一个新线程中,因为只有UI线程可以做这样的操作。
我是协程的新手,所以我不太明白我在这里缺少什么。
【问题讨论】:
-
Benjamin Basmaci,您仍然认为接受的答案是正确的吗?也许您会重新考虑您的选择,因为这个问题似乎很受欢迎,而寻求答案的用户可能会感到困惑。
-
@Sergey 非常感谢您的回答和您的 cmets。我相信你帮助了很多人,它显然显示在赞成票中。我更改了接受的答案,但我没有选择您的任何一个答案。原因是,我特别想要一个苗条、快速的解决方案,它不涉及为我拥有的每个用例编写新类。出于这个原因,我做出了自己的回答并接受了这个答案,因为这就是我目前正在做的事情。不确定这两种方法的优缺点,但这就是我正在寻找的这个问题。
标签: android multithreading kotlin android-asynctask kotlin-coroutines