Тест Android Junit завершается ошибкой: «Только исходный поток, создавший иерархию представлений, может касаться его представлений». - PullRequest
15 голосов
/ 05 ноября 2011

Я очень новичок в Android и пишу некоторые базовые тесты Android с использованием Robotium, и это не сработало, за исключением:

"android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."

Ниже приведено базовое описание тестового набора: -

testcase: -

public void testSearch() {
                        Activity a = getActivity();
            SearchItemActivity search = new SearchItemActivity(solo);
            search.searchText("ipod", a);   

    }

 SearchItemActivity.searchText(String) is defined as

    public void searchText(final String search, Activity act) {
                Button v = (Button) act
                .findViewById(com.test.mobile.R.id.text_search_field);
                ((Button) v).setText("");
                ((Button) v).setText(search);
                solo.sendKey(Solo.ENTER);
                solo.waitForActivity("FoundItemdDetailActivity");
                solo.assertCurrentActivity("Expected FoundItemDetail activity","FoundItemdDetailActivity");
    }

Любые предложения о том, как я могу изменить свой код, будут оценены

Ответы [ 2 ]

25 голосов
/ 14 ноября 2011
@UiThreadTest
public void yourMethod() {

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

http://developer.android.com/tools/testing/activity_test.html

6 голосов
/ 14 ноября 2011

Я полагаю, вы пытаетесь обновить пользовательский интерфейс из не-пользовательского потока.Так что для этого вам нужно поместить свой код в runOnUiThread().

ActivityName.this.runOnUiThread(new Runnable() {

            public void run() {
                // your code to update the UI
            }
        });
...