无法在 45 秒内启动意图。也许主线程在合理的时间内没有空闲?

Posted

技术标签:

【中文标题】无法在 45 秒内启动意图。也许主线程在合理的时间内没有空闲?【英文标题】:Could not launch intent within 45 seconds. Perhaps the main thread has not gone idle within a reasonable amount of time? 【发布时间】:2018-02-21 20:14:22 【问题描述】:

我正在编写浓缩咖啡测试。这是测试用例

Fab 的 OnClick,应用启动 QuizActivity。

让我向你解释一下我的应用程序。

所以应用要求是 -

    assets 文件夹中有 JSON 文件 我必须解析它并将数据存储在数据库中 在 Main Activity 上,将此数据从数据库加载到 recyclerview。有 Fab 按钮,单击它时,应用程序会将随机数据列表(我已在 recyclerview 中加载)传递给 QuizActivity

这是我的编码方式 -

    在 MainActivity 的 onCreate() 中使用 AsyncTask 仅解析一次数据并将数据插入数据库。 一旦数据可用,通过 AsyncTaskLoader 将其加载到 recyclerview 中 在 Fab 上设置 Onclick 侦听器。并将所需数据传递给 QuizActivity。

下面是我的测试

@RunWith(androidJUnit4.class)
public class ExampleInstrumentedTest 
   /* @Rule
    public IntentsTestRule<MainActivity> intentsTestRule =
            new IntentsTestRule<MainActivity>(MainActivity.class);
*/

    @Rule
    public ActivityTestRule<MainActivity> intentsTestRule =
            new ActivityTestRule<MainActivity>(MainActivity.class,false,true);

    @Test
    public void fabTest()
        onView(withId(R.id.fab)).perform(click());
        //Check if the text_question textview is displayed
        onView(withId(R.id.text_question)).check(matches(isDisplayed()));
    

   /* @Test
    public void clickFloatingActionButton() 
        onView(withId(R.id.fab))
                .perform(click());
        intended(hasComponent(new ComponentName(getTargetContext(), QuizActivity.class)));
    */

我的方法是-

    寻找工厂 执行点击 检查是否显示了 text_question 文本视图。请注意,此文本视图位于 QuizActivity。

运行测试后,我得到了

java.lang.RuntimeException: 无法启动意图 Intent 行动=android.intent.action.MAIN 标志=0x14000000 cmp=my_package_name/.MainActivity 在 45 秒内。也许 主线程在合理的时间内没有空闲? 可能会有动画或不断重绘的东西 屏幕。或者活动是在创建时进行网络调用?见 线程转储日志。供您参考上次事件队列是 在您的活动启动请求为 1505287862579 之前空闲,现在 上次队列空闲的时间是:1505287862579。如果这些数字是 同样,您的活动可能会占用事件队列。

PS - 我已关闭所有动画。我的代码没有进度条。

还要注意一点,如果我在 onCreate() 方法中注释掉 AsyncTask、AsyncTaskLoader、RecyclerView 部分,则测试通过。

我怀疑这可能是由于后台任务造成的。

有人遇到过类似的问题吗?如果您知道解决方案,请告诉我。我从两天开始就在挣扎。我在 *** 上搜索了类似的线程,但对我没有任何帮助。

【问题讨论】:

【参考方案1】:

我终于找到了解决办法!

实际上,罪魁祸首是我的适配器中的自定义视图。

Espresso 等到 AsyncTaskAsyncTaskLoader 加载数据,但它看起来像自定义视图导致此问题,如异常中所述:

主线程在合理的时间内没有空闲? 可能会有动画或不断重绘的东西 屏幕。

无论如何要克服这个问题,我需要做的是-

“如果测试正在运行,请将自定义视图的可见性设置为 GONE”

你会怎么做?

 private AtomicBoolean isTestRunning;

    public synchronized boolean isTestRunning () 
        if (null == isTestRunning) 
            boolean istest;

            try 

                Class.forName ("Full path of your TestName"); // for e.g. com.example.MyTest

                istest = true;
             catch (ClassNotFoundException e) 
                istest = false;
            

            isTestRunning = new AtomicBoolean (istest);
        

        return isRunningTest.get ();
    

现在我在这里使用Recyclerview 所以在ViewHolder

public InsectHolder(View itemView)
        
            super(itemView);
                       customView = (DangerLevelView) itemView.findViewById(R.id.danger_level_tv);

            if(isRunningTest()) 
                customView.setVisibility(View.GONE);
            
        

耶!你的测试将通过。

希望有人觉得它有帮助!

如果您有任何问题,请在下面的评论部分告诉我!

【讨论】:

你好程序员。当我使用 espresso 运行时,我在调用 api 时使用 progressDialog 显示测试上述问题的错误显示。我什至也尝试用你的答案来解决,但错误没有改变。这是我的问题***.com/questions/54320660/…

以上是关于无法在 45 秒内启动意图。也许主线程在合理的时间内没有空闲?的主要内容,如果未能解决你的问题,请参考以下文章

Qt:如何在不阻塞主线程的情况下播放声音?

在哪里启动线程?

Espresso 不使用 Gif 动画运行 Activity 测试

Heroku 错误:Web 进程在启动后 60 秒内无法绑定到 $PORT(使用 axios)

Heroku:Web 进程在启动后 60 秒内无法绑定到 $PORT

Heroku Web 进程在启动后 60 秒内无法绑定到 $PORT