在Android UIAutomator中处理异步操作,可以使用UiDevice
的wait
方法配合Espresso
的IdlingResource
接口。以下是一个简单的示例:
dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.4.0'
}
AsyncTaskIdlingResource
的类,实现IdlingResource
接口:import androidx.test.espresso.IdlingRegistry;
import androidx.test.espresso.IdlingResource;
public class AsyncTaskIdlingResource implements IdlingResource {
private ResourceCallback resourceCallback;
private boolean isIdleNow = true;
@Override
public String getName() {
return AsyncTaskIdlingResource.class.getName();
}
@Override
public boolean isIdleNow() {
return isIdleNow;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
public void setIdleState(boolean isIdleNow) {
this.isIdleNow = isIdleNow;
if (isIdleNow && resourceCallback != null) {
resourceCallback.onTransitionToIdle();
}
}
}
IdlingResource
。在@Before
注解的方法中,将其添加到IdlingRegistry
中:@Before
public void registerIdlingResource() {
IdlingRegistry.getInstance().register(new AsyncTaskIdlingResource());
}
AsyncTaskIdlingResource
的setIdleState
方法,将资源状态设置为空闲:// 假设你有一个异步任务类AsyncTask
new AsyncTask().execute();
// 在异步任务完成后,设置资源状态为空闲
AsyncTaskIdlingResource idlingResource = new AsyncTaskIdlingResource();
idlingResource.setIdleState(true);
@After
注解的方法中,取消注册IdlingResource
:@After
public void unregisterIdlingResource() {
IdlingRegistry.getInstance().unregister(new AsyncTaskIdlingResource());
}
现在,当你的异步操作完成时,UIAutomator将会等待,直到资源状态变为空闲。这样你就可以在测试用例中正确处理异步操作了。