Intereting Posts
Как отправить несколько изображений в формате base64 на сервере в android Вставить страницы в середине FragmentPageAdapter Поставщик контента для получения результатов с веб-сервера? Как начать настройку «установить как» (обои, контактное изображение и т. Д.) Разрешить неустойчивую Android Gradle строить на Jenkins Проверка подписки на выставление счетов в приложении Google Play в файле .Net – 2048 бит, PKCS # 1 v1.5 Android – xml – включить один и тот же макет несколько раз не работает Контролировать изменения в файле или каталоге? Android – imageView.getDrawable () возвращает null Android: получить результат от обратного вызова (сеть KOUSH ION) Не удалось получить провайдера com.google.firebase.provider.FirebaseInitProvider В Api ниже 21 Android никогда не получает пакет UDP Android / Java – Как создать соединение HTTPS? Существует ли постоянное несъемное глобальное хранилище для приложений на каждом устройстве Android? Что делать setDither, setFilterBitmap и setAntiAlias ​​в Canvas?

Разница между методом runOnUiThread () и аннотацией @UiThreadTest

Как название, может ли кто-нибудь объяснить разницу между методом runOnUiThread () и аннотацией @UiThreadTest? Я читал учебник по тестированию Android ( http://developer.android.com/tools/testing/activity_test.html ), который использует оба. Говорится:

Код в тестовом приложении, который взаимодействует с представлением тестируемого приложения, должен выполняться в потоке основного приложения, также известном как поток пользовательского интерфейса. Для этого вы используете метод Activity.runOnUiThread ()

а также:

Аннотирование @UiThreadTest сообщает Android о создании этого метода, чтобы он работал в потоке пользовательского интерфейса. Это позволяет способу изменить состояние виджнера spinner в тестируемом приложении.

Для метода runOnUi () данный код

public void testASpinnerUI() { mActivity.runOnUiThread( new Runnable() { @Override public void run() { mSpinner.requestFocus(); mSpinner.setSelection(INITIAL_POSITION); }// end of run } // end of runnable ); //end of runOnUiThread this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); for (int i = 0; i < TEST_POSITION; i++) { this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN); } this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER); mPos = mSpinner.getSelectedItemPosition(); mSelection = (String) mSpinner.getItemAtPosition(mPos); TextView resultView = (TextView) mActivity.findViewById(com.android.example.spinner.R.id.SpinnerResult); String resultText = (String) resultView.getText(); assertEquals(resultText, mSelection); } 

И для аннотации @UiThreadTest:

 @UiThreadTest public void testStatePause() { Instrumentation mInstr = this.getInstrumentation(); mActivity.setSpinnerPosition(TEST_STATE_PAUSE_POSITION); mActivity.setSpinnerSelection(TEST_STATE_PAUSE_SELECTION); mInstr.callActivityOnPause(mActivity); mActivity.setSpinnerPosition(0); mActivity.setSpinnerSelection(""); mInstr.callActivityOnResume(mActivity); int currentPosition = mActivity.getSpinnerPosition(); String currentSelection = mActivity.getSpinnerSelection(); assertEquals(TEST_STATE_PAUSE_POSITION, currentPosition); assertEquals(TEST_STATE_PAUSE_SELECTION, currentSelection); } 

Они кажутся взаимозаменяемыми в том смысле, что я могу удалить аннотацию из аннотированного теста и включить его содержимое в метод runOnUiThread (), и он проходит. Аналогично, я могу удалить метод runOnUiThread () из другого теста и добавить аннотацию @UiThreadTest и передать ее.

Так в чем разница?

Кроме того, в учебное пособие есть еще один тест:

 public void testStateDestroy() { mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION); mActivity.setSpinnerSelection(TEST_STATE_DESTROY_SELECTION); mActivity.finish(); mActivity = getActivity(); int currentPosition = mActivity.getSpinnerPosition(); String currentSelection = mActivity.getSpinnerSelection(); assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition); assertEquals(TEST_STATE_DESTROY_SELECTION, currentSelection); } 

Этот тест также взаимодействует с активностью, но не требует аннотации @UiThreadTest или метода runOnUiThread (). Почему это?

Разница заключается в семантике и побочных эффектах.

Во-первых, наличие @UiThreadTest вызывает @UiThreadTest активности, если она еще не была getActivity() .

Затем, в InstrumentatinTestCase , он использует getInstrumentation().runOnMainSync() для запуска полного теста.

Разница между getInstrumentation().runOnMainSync() и Activity.runOnUiThread() заключается в том, что первая ожидает завершения вызова (необходимо при выполнении полного теста или, вы знаете, вызов вещей внутри теста), в то время как последний не выполняет ,

Помимо этого, они отправляются в разные Handler ( runOnMainSync использует одно из ActivityThread , в то время как экземпляр Activity имеет свой собственный), но это не имеет значения, поскольку они планируются в том же MessageQueue .