在我的一个测试的@Before函数中,我正在尝试注册espresso idlingResource,但是我一直收到错误消息,说明它需要从主线程运行。这是我到目前为止:Espresso idlingResource - 如何注册?
@Before
public void setUp() throws Exception {
mIntentsTestRule.getActivity().sharedPrefRepo.clearAll();
new Thread(){
@Override
public void run() {
super.run();
IdlingResource loadingDialogIdlingResource = new LoadingDialogIdlingResource();
IdlingRegistry.getInstance().register(loadingDialogIdlingResource);
}
}.start();
}
但这种没有意义。即时通讯在另一个线程注册这些东西,但我会继续运行我的测试之前完成?真正注册这些东西的方式是什么?我创建了一个注销功能以及在拆解它看起来像这样:
@After
public void tearDown() throws Exception {
//handle any clean up
mIntentsTestRule.getActivity().sharedPrefRepo.clearAll();
freeIdlingResources();
mIntentsTestRule.getActivity().finish();
}
误差低于如果我不使用线程:
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.RuntimeException: This method can not be called from the main application thread
at android.support.test.espresso.base.IdlingResourceRegistry.runSynchronouslyOnMainThread(IdlingResourceRegistry.java:314)
at android.support.test.espresso.base.IdlingResourceRegistry.sync(IdlingResourceRegistry.java:90)
at android.support.test.espresso.Espresso.onView(Espresso.java:69)
请注意:前Espresso.registerIdlingResources( )方法已被IdlingRegistry通过getInstance()。register()弃用。
更新:这里是我的idlresource代码:
public class LoadingDialogIdlingResource implements IdlingResource {
private ResourceCallback resourceCallback;
private boolean isIdle;
@Override
public String getName() {
return LoadingDialogIdlingResource.class.getName();
}
@Override
public boolean isIdleNow() {
if (isIdle) return true;
Activity activity = getCurrentActivity();
if (activity == null) return false;
Fragment f = activity.getFragmentManager().findFragmentByTag(ProgressDialogFragment.class.getName());
isIdle = f == null;
if (isIdle) {
resourceCallback.onTransitionToIdle();
}
return isIdle;
}
public Activity getCurrentActivity() {
final Activity[] currentActivity = {null};
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable(){
public void run(){
Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
Iterator<Activity> it = resumedActivity.iterator();
currentActivity[0] = it.next();
}
});
return currentActivity[0];
}
@Override
public void registerIdleTransitionCallback(
ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
你能展示你的测试代码的其余部分吗?此错误似乎来自Espresson.onView(),并且问题可能出现在您调用该方法的位置。 – jdonmoyer
我已更新显示我创建的闲置资源的问题,不会在主线程上运行。 – j2emanue