android房间库和执行线程异步问题
android room library and executor thread async problem
fun setRecentToTextView() {
executor.execute(Runnable {
var tmp = getRecentFromDB()
if(tmp.size <1){
frameLayout1.visibility = FrameLayout.VISIBLE
frameLayout2.visibility = FrameLayout.INVISIBLE
}
else {
frameLayout1.visibility = FrameLayout.INVISIBLE
frameLayout2.visibility = FrameLayout.VISIBLE
content_textView.setText(tmp[0].content)
currentRecentIndex = tmp[0].index
}
})
}
首先,getRecentFromDB()函数具有房间图书馆的数据库访问功能。所以应该在非主线程中调用。
其次,setRecentToTextView() 函数用于更改每个 frameLayout 的可见性和设置片段的 textview。
但是由于执行程序线程访问视图错误而发生错误。
有什么方法可以避免这个问题吗?
有很多选择:
- runOnUiThread 方法(如下图所示)
- 使用绑定到主循环程序的处理程序。和runOnUIThread.
差不多
- LiveData - 您应该将 getRecentFromDB() 的值包装到 LiveData 并在 activity.
观察它
- Kotlin 协程 - 您应该在 getRecentFromDB 中使用修饰符 "suspend" 并启动协程以便能够从中获取结果。
- RxJava、Flow - 类似于 LiveData。
例如使用 runOnUiThread 切换到 UI 线程:
fun setRecentToTextView() {
executor.execute(Runnable {
var tmp = getRecentFromDB()
// THE START OF UI BLOCK
runOnUiThread(Runnable { // will send it to UI MessageQueue
if(tmp.size <1){
frameLayout1.visibility = FrameLayout.VISIBLE
frameLayout2.visibility = FrameLayout.INVISIBLE
}
else {
frameLayout1.visibility = FrameLayout.INVISIBLE
frameLayout2.visibility = FrameLayout.VISIBLE
content_textView.setText(tmp[0].content)
currentRecentIndex = tmp[0].index
}}
)
// THE END OF UI BLOCK
})
}
fun setRecentToTextView() {
executor.execute(Runnable {
var tmp = getRecentFromDB()
if(tmp.size <1){
frameLayout1.visibility = FrameLayout.VISIBLE
frameLayout2.visibility = FrameLayout.INVISIBLE
}
else {
frameLayout1.visibility = FrameLayout.INVISIBLE
frameLayout2.visibility = FrameLayout.VISIBLE
content_textView.setText(tmp[0].content)
currentRecentIndex = tmp[0].index
}
})
}
首先,getRecentFromDB()函数具有房间图书馆的数据库访问功能。所以应该在非主线程中调用。 其次,setRecentToTextView() 函数用于更改每个 frameLayout 的可见性和设置片段的 textview。 但是由于执行程序线程访问视图错误而发生错误。
有什么方法可以避免这个问题吗?
有很多选择:
- runOnUiThread 方法(如下图所示)
- 使用绑定到主循环程序的处理程序。和runOnUIThread. 差不多
- LiveData - 您应该将 getRecentFromDB() 的值包装到 LiveData 并在 activity. 观察它
- Kotlin 协程 - 您应该在 getRecentFromDB 中使用修饰符 "suspend" 并启动协程以便能够从中获取结果。
- RxJava、Flow - 类似于 LiveData。
例如使用 runOnUiThread 切换到 UI 线程:
fun setRecentToTextView() {
executor.execute(Runnable {
var tmp = getRecentFromDB()
// THE START OF UI BLOCK
runOnUiThread(Runnable { // will send it to UI MessageQueue
if(tmp.size <1){
frameLayout1.visibility = FrameLayout.VISIBLE
frameLayout2.visibility = FrameLayout.INVISIBLE
}
else {
frameLayout1.visibility = FrameLayout.INVISIBLE
frameLayout2.visibility = FrameLayout.VISIBLE
content_textView.setText(tmp[0].content)
currentRecentIndex = tmp[0].index
}}
)
// THE END OF UI BLOCK
})
}