Ho un'attività che utilizza una chiamata postDelayed:Espresso e postDelayed
public class SplashActivity extends Activity {
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(...);
handler.postDelayed(new Runnable() {
public void run() { finish(); }
}, 3000L);
}
}
Questo viene eseguito all'avvio dell'app, e ho bisogno di spostarsi e la mia schermata di login. Tuttavia, loopMainThreadUntilIdle di UIController non sembra prendere in considerazione il MessageQueue sottostante nel gestore. In quanto tale, questa azione termina immediatamente mentre sono ancora presenti messaggi nella coda.
onView(withId(R.id.splash_screen)).perform(new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(View.class);
}
@Override
public String getDescription() {
return "";
}
@Override
public void perform(final UiController uiController, final View view) {
uiController.loopMainThreadUntilIdle();
}
});
Non riesco a capire come bloccare fino a quando la coda non viene scaricata. Android stesso mi sta impedendo di fare un sacco di cose che avrei provato (come estendere Handler e sovrascrivere il metodo postDelayed, ecc ...)
Qualcuno ha qualche suggerimento su come gestire postDelayed?
Preferirei evitare uiController.loopMainThreadForAtLeast, che sembra hacky (come un Thread.sleep sarebbe)
Sto pensando che potrei semplicemente astrarre la spinta del messaggio sulla coda e iniettare qualche altra implementazione che funge da IdlingResource. Avrò un'implementazione predefinita nel mio codice che rimanda al gestore e nel codice di test uno che è un IdlingResource e icnrements/decrements – Matt