无法在后台线程上调用observeForever

Alg*_*gar 9 android android-room android-livedata android-architecture-components androidx

我一直在使用这里observeForever()描述的方法来测试Room和LiveData一段时间,并且它运行得很完美.但当我改为Android Studio 3.2(或者如果它是重构,不确定)时,该方法突然停止工作,抛出一个androidx

java.lang.IllegalStateException: Cannot invoke observeForever on a background thread
Run Code Online (Sandbox Code Playgroud)

我们该如何解决这个问题?

Alg*_*gar 23

我通过添加规则解决了这个问题InstantTaskExecutorRule.根据文件,它会

一个JUnit测试规则,它将架构组件使用的后台执行程序与另一个同步执行每个任务的后台执行程序交换.

所以需要添加

@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
Run Code Online (Sandbox Code Playgroud)

到测试类,它的工作.Java等价物将是

@Rule
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
Run Code Online (Sandbox Code Playgroud)

您还需要添加

androidTestImplementation "androidx.arch.core:core-testing:2.0.0"
Run Code Online (Sandbox Code Playgroud)

你的build.gradle依赖项.

  • 把它放在哪里? (2认同)

Zoh*_*Ali 5

作为这种方法的初学者,接受的答案对我来说有点模糊。所以只是想解释一下

将其添加到您的build.gradle

androidTestImplementation "androidx.arch.core:core-testing:2.0.0
Run Code Online (Sandbox Code Playgroud)

现在我们需要添加rule测试功能。假设我有一个测试函数,writeAndReadCategory那么它看起来像这样kotlin

    @get:Rule
    val instantTaskExecutorRule = InstantTaskExecutorRule()
    @Test
    fun writeAndReadCategory() {
        ....
    }
Run Code Online (Sandbox Code Playgroud)