没有 AsyncTask,运行 线程在后台并更新 UI 线程
Without AsyncTask, running a thread in background and updating the UI Thread
我试图从 Kotlin 的后台线程更新回收站视图内容。我没有使用 AsyncTask。
这是我的代码,我想知道是否有比这更好的方法:
在我的 MainActivity 中,我将 progressThread 作为成员变量。
var progressThread = Thread()
然后在我想要 运行 线程的方法中,我首先定义它...就像
progressThread = Thread (
Runnable {
kotlin.run {
try {
while (i <= 100 && !progressThread.isInterrupted) {
Thread.sleep(200)
//Some Logic
runOnUiThread {
//this runs in ui thread
}
i++
}
}catch (e:InterruptedException){
progressThread.interrupt()
}
}
})
之后我将使用与
相同的方法启动它
progressThread.start()
为了停止它,我有一个监听器来取消进度,在那个监听器的回调中,我写了:
progressThread.interrupt()
已更新
协程现在稳定了,:https://kotlinlang.org/docs/reference/coroutines-overview.html
旧答案
是的,您可以使用 kotlin anko 库中的 doAsync
执行此操作,该库相当简单易用。
在模块级别 gradle 文件中添加以下行:
compile "org.jetbrains.anko:anko-commons:0.10.0"
代码示例:
val future = doAsync {
// do your background thread task
result = someTask()
uiThread {
// use result here if you want to update ui
updateUI(result)
}
}
在 uiThread
中编写的代码块只有在您的 Activity 或 Fragment 处于前台模式(生命周期感知)时才会执行。因此,如果您因为不希望 ui 代码在 Activity 处于后台时执行而试图停止线程,那么这对您来说是一个理想的情况。
因为你可以检查 doAsync
returns 一个 Future 对象,所以你可以通过 cancel()
函数取消后台任务:
future.cancel(true)
如果你想在线程开始执行时停止线程,请传递 true
。
如果您有更特殊的情况来处理停止情况,那么您可以执行与示例中相同的操作。
您也可以使用 Kotlin Coroutines,但它处于实验阶段,您仍然可以尝试一下:https://kotlinlang.org/docs/reference/coroutines.html
我试图从 Kotlin 的后台线程更新回收站视图内容。我没有使用 AsyncTask。
这是我的代码,我想知道是否有比这更好的方法:
在我的 MainActivity 中,我将 progressThread 作为成员变量。
var progressThread = Thread()
然后在我想要 运行 线程的方法中,我首先定义它...就像
progressThread = Thread (
Runnable {
kotlin.run {
try {
while (i <= 100 && !progressThread.isInterrupted) {
Thread.sleep(200)
//Some Logic
runOnUiThread {
//this runs in ui thread
}
i++
}
}catch (e:InterruptedException){
progressThread.interrupt()
}
}
})
之后我将使用与
相同的方法启动它 progressThread.start()
为了停止它,我有一个监听器来取消进度,在那个监听器的回调中,我写了:
progressThread.interrupt()
已更新
协程现在稳定了,:https://kotlinlang.org/docs/reference/coroutines-overview.html
旧答案
是的,您可以使用 kotlin anko 库中的 doAsync
执行此操作,该库相当简单易用。
在模块级别 gradle 文件中添加以下行:
compile "org.jetbrains.anko:anko-commons:0.10.0"
代码示例:
val future = doAsync {
// do your background thread task
result = someTask()
uiThread {
// use result here if you want to update ui
updateUI(result)
}
}
在 uiThread
中编写的代码块只有在您的 Activity 或 Fragment 处于前台模式(生命周期感知)时才会执行。因此,如果您因为不希望 ui 代码在 Activity 处于后台时执行而试图停止线程,那么这对您来说是一个理想的情况。
因为你可以检查 doAsync
returns 一个 Future 对象,所以你可以通过 cancel()
函数取消后台任务:
future.cancel(true)
如果你想在线程开始执行时停止线程,请传递 true
。
如果您有更特殊的情况来处理停止情况,那么您可以执行与示例中相同的操作。
您也可以使用 Kotlin Coroutines,但它处于实验阶段,您仍然可以尝试一下:https://kotlinlang.org/docs/reference/coroutines.html