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。 但是由于执行程序线程访问视图错误而发生错误。

有什么方法可以避免这个问题吗?

有很多选择:

  1. runOnUiThread 方法(如下图所示)
  2. 使用绑定到主循环程序的处理程序。和runOnUIThread.
  3. 差不多
  4. LiveData - 您应该将 getRecentFromDB() 的值包装到 LiveData 并在 activity.
  5. 观察它
  6. Kotlin 协程 - 您应该在 getRecentFromDB 中使用修饰符 "suspend" 并启动协程以便能够从中获取结果。
  7. 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
    })

}