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

Pro*_*mer 6 android android-intent android-asynctask android-espresso

我正在写Espresso Test.这是测试用例

点击Fab,该应用程序启动QuizActivity.

让我向你解释我的应用程序.

所以应用程序的要求是 -

  1. 资产文件夹中有JSON文件
  2. 我必须解析它并将数据存储在数据库中
  3. 在主活动上将此数据从数据库加载到recyclerview.有Fab按钮,点击它应用程序将随机数据列表(我已经在recyclerview中加载)传递给QuizActivity

这是我编码的方式 -

  1. 在MainActivity的onCreate()中,使用AsyncTask只将数据解析并插入数据库一次.
  2. 数据可用后,通过AsyncTaskLoader将其加载到recyclerview中
  3. 在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)));
    }*/
}
Run Code Online (Sandbox Code Playgroud)

我的方法是 -

  1. 找到Fab
  2. 执行点击
  3. 检查是否显示了text_question textview.请注意,此textview是关于QuizActivity的.

在我运行测试后,我得到了

java.lang.RuntimeException:无法在45秒内启动意图Intent {act = android.intent.action.MAIN flg = 0x14000000 cmp = my_package_name/.MainActivity}.也许主线程在合理的时间内没有闲置?可能会有一个动画或不断重新绘制屏幕的东西.或者活动是在创建网络呼叫?请参阅threaddump日志.在您的活动启动请求为1505287862579之前,上次事件队列空闲的时间供您参考,现在队列最后一次空闲时间是:1505287862579.如果这些数字相同,您的活动可能会占用事件队列.

PS - 我关掉了所有的动画.我在代码中没有进度条.

还有一点需要注意,如果我在onCreate()方法中注释掉AsyncTask,AsyncTaskLoader,RecyclerView部分,那么测试就会通过.

我怀疑它可能是由于后台任务造成的.

有人遇到类似问题吗?如果您知道解决方案,请告诉我.我两天都在苦苦挣扎.我在stackoverflow上搜索了类似的线程,但没有任何对我有用.

Pro*_*mer 4

我终于找到解决方案了!

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

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

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

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

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

你会怎么做?

 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 ();
    }
Run Code Online (Sandbox Code Playgroud)

现在我在这里使用Recyclerviewso ViewHolder

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

            if(isRunningTest()) {
                customView.setVisibility(View.GONE);
            }
        }
Run Code Online (Sandbox Code Playgroud)

耶!你的测试将会通过。

希望有人觉得它有帮助!

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