我有一个正在使用 Robotium 测试的类,在它的onPause()
方法中我只是清除了EditText
(我不需要在之后保留数据onPause()
)。
所以我有一个正在测试的课程:
@Override
protected void onPause() {
super.onPause();
mEdtPassword.setText("");
}
及测试方法:
public void testOnPauseOnStart() {
Activity mActivity = getActivity();
solo.typeText(0, CORRECT_PASSWORD);
getInstrumentation().callActivityOnPause(mActivity);
}
但后来我得到一个错误:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4077)
at android.view.View.invalidate(View.java:10322)
at android.widget.TextView.invalidateRegion(TextView.java:4395)
at android.widget.TextView.invalidateCursor(TextView.java:4338)
at android.widget.TextView.spanChange(TextView.java:7186)
at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8821)
at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:688)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
at android.text.Selection.setSelection(Selection.java:76)
at android.text.Selection.setSelection(Selection.java:87)
at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
at android.widget.TextView.setText(TextView.java:3555)
at android.widget.TextView.setText(TextView.java:3425)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3400)
at <package>.ui.CheckPasswordActivity.onPause(CheckPasswordActivity.java:182)
如果我使用solo.setActivityOrientation(Solo.LANDSCAPE)
我不会收到此错误。
然后,如果我mEdtPassword.setText("")
用runOnUiThread()
一切都很好。
所以问题是:
为什么我使用时没有这个例外,
solo.setActivityOrientation()
但我使用时却getInstrumentation().callActivityOnPause(mActivity)
有,我认为两者都在做同样的事情。我应该出于其他原因将类似的东西包裹
mEdtPassword.setText("")
在onPause()
其他地方,还是只是为了测试目的而需要它?runOnUiThread
这是否意味着如果我想对我的 UI 进行测试,我需要编写更多代码(比如在 UI 线程上运行普通操作)才能运行它们?
非常感谢您的澄清。