我正在开发一个应用程序,并且我有一个本地SQLite数据库用于保留一些用户数据,并且我还使用Room持久性库,因为这是推荐的方法。我按照本教程创建了一个模型,一个DAO和一个数据库本身。因此,在活动中,我只是使用新线程填充了RecyclerView
,它可以正常工作。
但是后来我在另一个视图中遇到了问题,我想将TextView
文本更改为从数据库中获得的值。我不能像以前那样在另一个线程中执行此操作,因为我得到了CalledFromWrongThreadException
,也因为我得到了IllegalStateException
而无法从主线程调用它。我发现的所有教程都向我提供了有关数据库和DAO创建的已知信息,并且所有教程都使用allowMainThreadQueries()
并附带说明,不应在生产中使用。但是,更多与问题相关的研究使我找到了使用runOnUiThread()
的一些解决方法,但这在这里并不是真正的解决方案。所以我有一个问题:
我错过了任何直接的方法吗?(或者不是那么简单但合理)。
答案 0 :(得分:1)
在您的情况下,对数据库的访问应该看起来像这样
Thread{
val text = dataBase.getDao().getText()
Handler(Looper.getMainLooper()).post {
textView.text = text
}
}.start()
答案 1 :(得分:0)
使用Room的最干净方法是使用LiveData API和Lifecycle API,您可以检查link 我建议您观看其他Google代码实验室,它们对我有很大帮助