在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將會等待,直到資源狀態變為空閑。這樣你就可以在測試用例中正確處理異步操作了。