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

时间:2017-09-13 08:02:33

标签: android android-intent android-asynctask android-espresso

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

OnClick of Fab,该应用程序启动QuizActivity。

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

所以应用程序要求是 -

  1. 资产文件夹
  2. 中有JSON文件
  3. 我必须解析它并将数据存储在数据库中
  4. On Main Activity将此数据从数据库加载到recyclerview。有Fab按钮,点击它应用程序将随机数据列表(我已经在recyclerview中加载)传递给QuizActivity
  5. 以下是我编码的方式 -

    1. 在MainActivity的onCreate()中,使用AsyncTask只将数据解析并插入数据库一次。
    2. 数据可用后,通过AsyncTaskLoader
    3. 将其加载到recyclerview中
    4. 在Fab上设置Onclick侦听器。并将所需数据传递给QuizActivity。
    5. 以下是我的测试

      @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)));
          }*/
      }
      

      我的方法是 -

      1. 查找Fab
      2. 执行点击
      3. 检查是否显示text_question textview。请注意,此文本视图位于QuizActivity上。
      4. 在我进行测试后,我正在

          

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

我终于得到了解决方案!

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

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);
            }
        }

然后!你的考试将通过。

希望有人觉得它有用!

如果您对以下评论部分有任何疑问,请与我们联系!