Java 如何在浓缩咖啡中允许繁忙的工作线程

Java 如何在浓缩咖啡中允许繁忙的工作线程,java,android,android-espresso,android-testing,Java,Android,Android Espresso,Android Testing,我正在尝试测试一个应用程序的进度指示器,它在视图模型获取数据时显示一个不确定的进度指示器 为了测试这一点,我模拟了返回数据的提供者,并使其阻塞,直到我的测试给出命令它继续。基本设置如下所示: @测试 公共void testProgressIndicator(){ 供应商(模拟供应商); 开始触觉(); //模拟提供程序现在在工作线程上运行,不会完成 //直到我们告诉它。 //我们现在应该看到一个进展指标。 打开视图(带id(R.id.进度指示器))。检查( 匹配(有效可见性(Visibility

我正在尝试测试一个应用程序的进度指示器,它在视图模型获取数据时显示一个不确定的进度指示器

为了测试这一点,我模拟了返回数据的提供者,并使其阻塞,直到我的测试给出命令它继续。基本设置如下所示:

@测试
公共void testProgressIndicator(){
供应商(模拟供应商);
开始触觉();
//模拟提供程序现在在工作线程上运行,不会完成
//直到我们告诉它。
//我们现在应该看到一个进展指标。
打开视图(带id(R.id.进度指示器))。检查(
匹配(有效可见性(Visibility.VISIBLE));
//告诉工作线程完成。
mockProvider.setResult();
//工作线程现在返回一个结果,即进度指示器
//应该走了。
打开视图(带id(R.id.进度指示器))。检查(
匹配(有效可见性(Visibility.GONE));
}
此代码很旧,因此提供程序正在使用
AsyncTask
在工作线程上使用阻塞代码

然而,浓缩咖啡通常会等待所有工人完成,以确保结果不依赖于时间。特别是,它使用
AsyncTaskPoolMonitor
等待所有挂起的
AsyncTask
对象。这通常是伟大的,但在我的情况下,我希望这个线程保持繁忙,而浓缩咖啡继续。我怎样才能告诉意式浓缩咖啡不要等这条线

廉价的逃避方法是只使用
线程
,并通过
处理程序
或类似的方式进行通信,但最好在使用
异步任务
保留设置的同时找到解决方案

当我进入调试器时,我看到我的测试运行程序线程卡在第一个
check()

wait:-1,对象(java.lang)
parkFor$:2137,线程(java.lang)
停车场:358,不安全(太阳杂项)
park:190,锁支持(java.util.concurrent.locks)
wait:2059,AbstractQueuedSynchronizer$ConditionObject(java.util.concurrent.locks)
take:442,LinkedBlockingQueue(java.util.concurrent)
gatherAnyResult:83,InteractionResultsHandler(androidx.test.espresso)
gatherAnyResult:52,InteractionResultsHandler(androidx.test.espresso)
waitForAndHandleInteractionResults:314,ViewInteraction(androidx.test.espresso)
支票:300,ViewInteraction(androidx.test.espresso)

testProgressIndicator:76,MyFragmentTest(com.my.test)您应该计算IDlingResource, 在AsyncTask的onPreExecute()中调用增量()并在onPostExecute()中调用减量()


我不确定自己是否完全理解这个问题,但我认为这可能会有所帮助here@BenP. 是的,我想这就是我要找的!我模模糊糊地记得某件事,但不知道它在哪里。事实上,在阅读文档时,我认为这是针对相反的情况——闲置资源是为了告诉浓缩咖啡在完成某件事之前不要继续。我试着让它继续,即使它认为有些事情还在继续。哦,我的错误。阻塞是如何实现的?我的理解是,浓缩咖啡等待一组特定的事情(例如运行
AsyncTask
s)。你在用这些吗?@BenP。是的,它恰好是一个
异步任务
doInBackground
(在现实生活中)获取数据,在我的测试中,它等待信号量,直到测试告诉它继续(通过上面相同代码中的
setResult
),谢谢!但是,除非我弄错了,否则情况正好相反——创建和注册资源会告诉框架有一个繁忙的资源,系统需要等待。不能使用减量()使计数器低于0(它将引发异常),即使可以,计数为负数也不会撤消另一个被视为非空闲的资源(在本例中为AsyncTask)。
wait:-1, Object (java.lang)
parkFor$:2137, Thread (java.lang)
park:358, Unsafe (sun.misc)
park:190, LockSupport (java.util.concurrent.locks)
await:2059, AbstractQueuedSynchronizer$ConditionObject (java.util.concurrent.locks)
take:442, LinkedBlockingQueue (java.util.concurrent)
gatherAnyResult:83, InteractionResultsHandler (androidx.test.espresso)
gatherAnyResult:52, InteractionResultsHandler (androidx.test.espresso)
waitForAndHandleInteractionResults:314, ViewInteraction (androidx.test.espresso)
check:300, ViewInteraction (androidx.test.espresso)
testProgressIndicator:76, MyFragmentTest (com.my.test)  <<< ***********************
invoke:-1, Method (java.lang.reflect)
runReflectiveCall:50, FrameworkMethod$1 (org.junit.runners.model)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
invokeExplosively:47, FrameworkMethod (org.junit.runners.model)
evaluate:17, InvokeMethod (org.junit.internal.runners.statements)
evaluate:80, RunBefores (androidx.test.internal.runner.junit4.statement)
evaluate:531, ActivityTestRule$ActivityStatement (androidx.test.rule)
evaluate:20, RunRules (org.junit.rules)
runLeaf:325, ParentRunner (org.junit.runners)
runChild:78, BlockJUnit4ClassRunner (org.junit.runners)
runChild:57, BlockJUnit4ClassRunner (org.junit.runners)
run:290, ParentRunner$3 (org.junit.runners)
schedule:71, ParentRunner$1 (org.junit.runners)
runChildren:288, ParentRunner (org.junit.runners)
access$000:58, ParentRunner (org.junit.runners)
evaluate:268, ParentRunner$2 (org.junit.runners)
run:363, ParentRunner (org.junit.runners)
run:104, AndroidJUnit4 (androidx.test.ext.junit.runners)
runChild:128, Suite (org.junit.runners)
runChild:27, Suite (org.junit.runners)
run:290, ParentRunner$3 (org.junit.runners)
schedule:71, ParentRunner$1 (org.junit.runners)
runChildren:288, ParentRunner (org.junit.runners)
access$000:58, ParentRunner (org.junit.runners)
evaluate:268, ParentRunner$2 (org.junit.runners)
run:363, ParentRunner (org.junit.runners)
run:137, JUnitCore (org.junit.runner)
run:115, JUnitCore (org.junit.runner)
execute:56, TestExecutor (androidx.test.internal.runner)
onStart:388, AndroidJUnitRunner (androidx.test.runner)
run:2075, Instrumentation$InstrumentationThread (android.app)