如何运行主线程的afterTextChanged



@实体生物

我正在尝试更新数据库中的name属性。

@Entity(primaryKeys = ["name"])
data class Creature(
@ColumnInfo(defaultValue = "New Creature") val name: String
)

@刀生物刀

更新名称的查询在这里,在DAO中。

@Dao
interface CreatureDao {
[...]
// update creature name
@Query("UPDATE Creature SET name=:newName WHERE name=:oldName")
fun updateCreatureName(oldName: String, newName: String)
}

MyRepository

我的视图模型通过我的存储库进行查询

class MyRepository(private val creatureDao: CreatureDao) {
[...]
// update creature name
@Suppress("RedundantSuspendModifier")
@WorkerThread
suspend fun updateCreatureName(oldName: String, newName: String) {
creatureDao.updateCreatureName(oldName, newName)
}
}

SharedViewModel

这就是我的视图模型调用更新名称属性的地方

class SharedViewModel(
private val repository: MyRepository
) : ViewModel() {
[...]
fun updateCreatureName(oldName: String, newName: String) {
viewModelScope.launch { repository.updateCreatureName(oldName, newName) }
}
}

关于碎片

当名称TextInputEditText更改时,将从AboutFragment调用此视图模型的updateCreatureName((方法。。。

class AboutFragment() : Fragment() {
[...]
// update creature record when creature name is edited
binding.nameTextInputEditText.addTextChangedListener(object : TextWatcher {
private lateinit var oldName: String
private lateinit var newName: String
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
oldName = s.toString()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
newName = s.toString()
}
override fun afterTextChanged(s: Editable?) {
sharedViewModel.updateCreatureName(oldName, newName)
}
})
}
}

问题

我收到错误

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

当我尝试启动活动片段时。如何运行

override fun afterTextChanged()

偏离主线?

您可以使用ExecutorService,然后调用传递Runnable的方法submit()。在类中创建一个实例,或者在使用依赖项注入的情况下注入一个Singleton。也许Jetpack框架在这里也提供了一些更好的想法。

关键是使用

viewModelScope.launch(Dispatcher.IO){...}

而不是

viewModelScope.launch{...}

"当您没有传递Dispatcher来启动时,任何协同程序都会启动在主线程中从viewModelScope运行"源

相关内容

  • 没有找到相关文章

最新更新