首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浓缩咖啡和postDelayed

浓缩咖啡和postDelayed
EN

Stack Overflow用户
提问于 2015-08-21 14:43:23
回答 2查看 3.7K关注 0票数 13

我有一个使用postDelayed调用的活动:

代码语言:javascript
复制
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。因此,当队列中仍然有消息时,此操作立即结束。

代码语言:javascript
复制
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那样)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-22 17:27:14

当Espresso等待时,它确实考虑到了MessageQueue,但其方式与您的想法不同。要成为空闲,队列必须为空,的任务将在15毫秒后运行。

您可以自己检查代码,特别是UiControllerImpl.java中的方法UiControllerImpl.java和文件QueueInterrogator.java。在后一个文件中,您还将看到Espresso如何检查MessageQueue (方法determineQueueState())的逻辑。

现在,如何解决您的问题?有许多方法:

  1. 使用AsyncTask而不是Handler,在后台线程上睡觉,并执行操作onPostExecute()。这是因为Espresso会等待AsyncTask完成,但是您可能不喜欢另一个线程的开销。
  2. 在测试代码中睡觉,但您已经不喜欢这种方法了。
  3. 编写您的自定义IdlingResource:这是一种通用机制,可以让Espresso知道什么时候有些东西处于空闲状态,以便它能够运行操作和断言。对于这种方法,您可以:
代码语言:javascript
复制
- 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

另见:文档和样本另一个样本

票数 15
EN

Stack Overflow用户

发布于 2015-08-21 15:11:12

据我所知,没有等待活动完成方法在浓咖啡。您可以实现您自己版本的waitForCondition,这是机器人所拥有的。这样,你只能在需要的时候等待,你可以发现你的活动没有完成的问题。

你基本上每隔x毫秒就轮询你的情况,就像。

代码语言:javascript
复制
while (!conditionIsMet() && currentTime < timeOut){
    sleep(100);
}

boolean conditionIsMet() {
    return "espresso check for if your splash view exists";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32143243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档