我有一个使用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);
}
}这运行在应用程序启动,我需要导航它和我的登录屏幕。但是,UIController的loopMainThreadUntilIdle似乎没有考虑到处理程序中的底层MessageQueue。因此,当队列中仍然有消息时,此操作立即结束。
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();
}
});在排完队列之前,我一直想不出怎么阻止它。Android本身阻止了我做很多我会尝试的事情(比如扩展Handler和重写postDelayed方法等等)。
有人对如何处理postDelayed有任何建议吗?
我宁愿避免uiController.loopMainThreadForAtLeast,因为它看起来很烦人(就像Thread.sleep那样)
发布于 2015-08-22 17:27:14
当Espresso等待时,它确实考虑到了MessageQueue,但其方式与您的想法不同。要成为空闲,队列必须为空,或的任务将在15毫秒后运行。
您可以自己检查代码,特别是UiControllerImpl.java中的方法UiControllerImpl.java和文件QueueInterrogator.java。在后一个文件中,您还将看到Espresso如何检查MessageQueue (方法determineQueueState())的逻辑。
现在,如何解决您的问题?有许多方法:
AsyncTask而不是Handler,在后台线程上睡觉,并执行操作onPostExecute()。这是因为Espresso会等待AsyncTask完成,但是您可能不喜欢另一个线程的开销。IdlingResource:这是一种通用机制,可以让Espresso知道什么时候有些东西处于空闲状态,以便它能够运行操作和断言。对于这种方法,您可以:- Use the class `CountingIdlingResource` that comes with Espresso
- Call `increment()` when you post your runnable and `decrement()` inside the runnable after your logic has run
- Register your `IdlingResource` in the test setup and unregister it in the tear down
另见:文档和样本,另一个样本
发布于 2015-08-21 15:11:12
据我所知,没有等待活动完成方法在浓咖啡。您可以实现您自己版本的waitForCondition,这是机器人所拥有的。这样,你只能在需要的时候等待,你可以发现你的活动没有完成的问题。
你基本上每隔x毫秒就轮询你的情况,就像。
while (!conditionIsMet() && currentTime < timeOut){
sleep(100);
}
boolean conditionIsMet() {
return "espresso check for if your splash view exists";
}https://stackoverflow.com/questions/32143243
复制相似问题