无法在 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 等到 AsyncTask
或 AsyncTaskLoader
加载数据,但它看起来像自定义视图导致此问题,如异常中所述:
主线程在合理的时间内没有空闲? 可能会有动画或不断重绘的东西 屏幕。
无论如何要克服这个问题,我需要做的是-
“如果测试正在运行,请将自定义视图的可见性设置为 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 秒内启动意图。也许主线程在合理的时间内没有空闲?的主要内容,如果未能解决你的问题,请参考以下文章
Espresso 不使用 Gif 动画运行 Activity 测试
Heroku 错误:Web 进程在启动后 60 秒内无法绑定到 $PORT(使用 axios)