我有一個正在使用Robotium進行測試的類,它的onPause()
方法我只是清除了EditText
(我不需要在onPause()
之後保存數據)。runOnUiThread使用技巧
所以我有一個類,這是一個測試下:
@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線程上運行日常操作)才能運行它們?
非常感謝您的澄清。
可以顯示完整的logcat跟蹤... – 2013-02-12 11:12:21
@PrafulBhatnagar完成。現在我知道問題所在。如果你願意的話,還是希望聽到這三個問題的答案。 – Eugene 2013-02-12 11:17:14