es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de Base de Datos de Room al realizar la prueba de espresso “No se puede acceder a la base de datos en el hilo principal”.

Estoy utilizando Espresso para realizar pruebas y estoy recibiendo un error al ejecutar el siguiente método.

viewModel.getData().observe(viewLifecycleOwner, Observer { options ->
            Log.d(TAG, "onViewCreated: $options")
            val data = options.filter { option -> option.type!! == OptionType.DATA}

<pre><code>        updateData.updateUIComponent(data)
    })

El método “getData” retorna un objeto LiveData y funciona bien en los Fragments, pero no está funcionando en la clase de prueba de Espresso.

“No se puede acceder a la base de datos en el hilo principal ya que podría bloquear la interfaz de usuario durante un largo período de tiempo.”

Esta es mi clase de prueba.

“`
@LargeTest
@RunWith(AndroidJUnit4::class)
open class BaseIntegrationTest {

@get:Rule
val instantTestExecutorRule = InstantTaskExecutorRule()

lateinit var navController: TestNavHostController

lateinit var fragmentScenario: FragmentScenario<DetailsFragment>

@Before
fun initTest() {

<pre><code>navController = TestNavHostController(
ApplicationProvider.getApplicationContext()
)
</code></pre>

}

@Test
fun launchFragment() {

<pre><code>val bundle = Bundle()

fragmentScenario =
launchFragmentInContainer(bundle, themeResId = R.style.Theme_mainTheme)

fragmentScenario.moveToState(Lifecycle.State.STARTED)

UiThreadStatement.runOnUiThread {
navController.setGraph(R.navigation.app_navigation_graph)
}
fragmentScenario.onFragment { fragment ->

//CollectFeedbackFragment()
Navigation.setViewNavController(fragment.requireView(), navController)
}

onView(withId(R.id.progressBar)).isVisible()
</code></pre>

}

}
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error que estás recibiendo está relacionado con el acceso a la base de datos en el hilo principal, lo que puede bloquear la interfaz de usuario por un largo período de tiempo. Para resolver este problema, tienes que mover el código de acceso a la base de datos a un hilo en segundo plano, como el uso de coroutines o RxJava.

    En tu caso, puedes envolver el método viewModel.getData() dentro de un bloque viewModelScope.launch(Dispatchers.IO) para ejecutar el código en un hilo en segundo plano.

    Aquí tienes un ejemplo:

    viewModelScope.launch(Dispatchers.IO) {
        viewModel.getData().observe(viewLifecycleOwner, Observer { options ->
            Log.d(TAG, "onViewCreated: $options")
            val data = options.filter { option -> option.type!! == OptionType.DATA}
    
            updateData.updateUIComponent(data)
        })
    }
    

    Al utilizar Dispatchers.IO, el código se ejecutará en un hilo en segundo plano, evitando cualquier posible bloqueo de la interfaz de usuario.

Comments are closed.