Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

480
Vistas
Android Navigation Instrumentation test throws Method addObserver must be called on the main thread

I have two Fragments, one being a home fragment in my graph. The User will be navigated to the second fragment upon clicking a button. It works as expected by navigating the user to the second fragment and displaying the text. So the graph is good.

Now I wanted to write an instrumentation test.

@RunWith(AndroidJUnit4::class)
class TransitionTest {

    @Test
    fun testNavigationToSecondFragment() {
        
        val navController = TestNavHostController(
            ApplicationProvider.getApplicationContext())

        navController.setGraph(R.navigation.my_graph) <--throws exception

        // the rest of my test continues here
    }
}

However, the line shown above to set the graph throws following exception:

IllegalStateException: Method addObserver must be called on the main thread.

My environment:

fragment_version = 1.2.5 nav_version = 2.3.1 espresso = 3.3.0

Does anyone have any idea what is going on and how to solve it?

over 4 years ago · Hanz Gallego
4 Respuestas
Responde la pregunta

0

I faced the same, so I will try to explain the root cause of this. Starting from androidx.lifecycle:lifecycle-*:2.3.0-alpha06. There is a behavior change in LifecycleRegistry . LifecycleRegistry now verifies that its methods are called on the main thread. Now remains another question unsolved whether the instrumentation tests are running in the MainThread? Apparently no otherwise it would have passed. It is using Instrumentation Thread where most of the tests run. As per documentation, you can use @UiThreadTest or runOnUiThread as in the top answer.

over 4 years ago · Hanz Gallego Denunciar

0

I started having this problem as well, after upgrading the package:

implementation 'androidx.activity:activity:1.2.0-alpha06'

to

 implementation 'androidx.activity:activity:1.2.0-beta01'

In my code I am opening a Fragment in a background thread, and this seems to break with new package. The fragment adds an observer during lifecycle:

Fragment.java initlifecycle()

I think your workaround of wrapping the call to run on UI thread is the only plausible solution, since the observer may be added internally in your case as well.

over 4 years ago · Hanz Gallego Denunciar

0

I wrapped the setGraph function in runOnUiThread as such, and the test passes. I will update the answer once I find out the real cause and better solution.

runOnUiThread {
    navController.setGraph(R.navigation.my_graph)
}
over 4 years ago · Hanz Gallego Denunciar

0

There is one more solution to solve the issue by using this

InstrumentationRegistry.getInstrumentation().runOnMainSync {
            navController.setGraph(R.navigation.my_graph)
        }

Since @UiThreadTest only work in @Test, @Before and @After so if you have some common test function they might not work as expected

over 4 years ago · Hanz Gallego Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda