我有一个正在使用延迟后呼叫的活动:

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似乎没有考虑处理程序中的底层消息队列。因此,当队列中仍有消息时,此操作将立即完成。
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和重写postdelated方法等等)。
有人对如何处理延迟的邮件有什么建议吗?
我宁愿避免uicontroller.loopmainthreadfortleast,它看起来很粗糙(就像thread.sleep那样)

最佳答案

当意式浓缩咖啡等待时,它确实考虑到了MessageQueue,但与你的想法不同。若要空闲,队列必须为空,或者任务要在15毫秒后运行。
您可以自己检查代码,特别是loopUntil()中的方法UiControllerImpl.java和文件QueueInterrogator.java。在后一个文件中,您还可以找到espresso如何检查MessageQueue(methoddetermineQueueState())的逻辑。
现在,如何解决你的问题?有很多方法:
使用AsyncTask而不是Handler,在后台线程上睡眠并执行操作onPostExecute()。这是个诀窍,因为浓缩咖啡会等AsyncTask结束,但你可能不喜欢另一个线程的开销。
在测试代码中睡觉,但是你已经不喜欢这种方法了。
编写您的自定义IdlingResource:这是一种通用的机制,可以让espresso知道什么东西处于空闲状态,以便它可以运行操作和断言。对于这种方法,您可以:
使用浓缩咖啡附带的课程
在逻辑运行后将runnable和runnable内的CountingIdlingResource发布时调用increment()
在测试设置中注册decrement(),并在下拉列表中取消注册
另请参见:docs and sampleanother sample

08-05 09:10