Android: only the original thread that created the view hierarchy can touch its views - UnitTest

I am developing UnitTest for a small application. This is a cout app, numerology number. You are using your date of birth. I have a problem, why would I call a method that checks the number and puts the value in the TextView. I got error

`android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6347)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:871)
at android.view.View.requestLayout(View.java:16472)
at android.view.View.requestLayout(View.java:16472)
at android.view.View.requestLayout(View.java:16472)
at android.view.View.requestLayout(View.java:16472)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
at android.view.View.requestLayout(View.java:16472)
at android.widget.ScrollView.requestLayout(ScrollView.java:1481)
at android.view.View.requestLayout(View.java:16472)
at android.view.View.requestLayout(View.java:16472)
at android.widget.TextView.checkForRelayout(TextView.java:6817)
at android.widget.TextView.setText(TextView.java:3947)
at android.widget.TextView.setText(TextView.java:3805)
at android.widget.TextView.setText(TextView.java:3780)
at com.numerology.MainActivity.showTextInfo(MainActivity.java:168)
at com.numerology.test.Numerology.testMasterNumber(Numerology.java:46)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)

      

`

My layout: `   

  <TextView
    android:id="@+id/lbInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:textColor="@color/yellow"
    android:text="Please set the date of Your birth"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/lblDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="80dp"
    android:textColor="@color/white"
    android:text="Date of your birth (DD-MM-YYYY): "
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/tvDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="100dp"
    android:textColor="@color/white"
    android:text=""
    android:textAppearance="?android:attr/textAppearanceLarge" />

 <TextView
    android:id="@+id/numberInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="130dp"
    android:textColor="@color/yellow"
    android:text=""
    android:textAppearance="?android:attr/textAppearanceMedium" />

  <TextView
    android:id="@+id/description"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="160dp"
    android:textColor="@color/yellow"
    android:text="Description:"
    android:textAppearance="?android:attr/textAppearanceMedium" />


<DatePicker
    android:id="@+id/dpResult"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tvDate"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="88dp" />

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_marginTop="30dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/description">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
<TextView
        android:id="@+id/allInformation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/white"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium" />        
</LinearLayout>
</ScrollView>

</RelativeLayout>`

      

My method that I would like to test: `

public void showTextInfo(int number){
        if (number == 1){
            finInformation.setText("People with vibration digits 1, are born leaders, who can     not stand authority over him and wishing at all costs to preserve their independence.     Confident, blockbuster, effective in action, full of charisma, have a really high potential     energy and a sense of independence. They feel a strong need for self-improvement. They are     very creative, able to demonstrate their own initiative, they have no problems with     communicative, able to speak beautifully. Top comes the realization of short-term actions.     \n\n" +
                    "Strength of character, individuality, desire to create, creativity, dominance, bold ideas, persuasive, charisma and outstanding leadership skills to help them in reconciliation of people, which ones indicate the way forward. Ones usually have high authority and are often the model to follow. " + 
                    "They have a practical sense, a strong will, organizational capacity, but smaller executive ability. These are dynamic in nature, characterized by their spontaneity, willingness to take risks. Numerological ambitious ones are those having the ability to self-realization and organizational talent. They are enterprising and intelligent, feel a high need for power, achievement of high social position. " + 
                    "Ones strive for perfection, are self-critical. Not tolerate criticism from others. Their weaknesses, it peremptoriness, a tendency to self-absorption, domination, arrogance, risky behavior, the tendency to impose their own opinions, impatience. \n\n" +
                    "Failures can cause a feeling of frustration, excessive nervousness and explosiveness. In partnership readily show their feelings, they feel a great need to appreciate, may be overly jealous, even possessive. " +
                    "For people with One numerology number it hard to get a compromise, they prefer to impose their views and way of seeing.");
        }`

      

+3


source to share


3 answers


I solved this issue with adnotation @UiThreadTest before my test method.



+7


source


enter the code where you will set the textview value in the new thread;

  Handler h=new Handler();
  h.post(new Runnable() {
        public void run() {

        textView.setText(value);
        }
   });

      



It looks like your text is finInformation that's in run ();

0


source


getActivity()

the implementation is done like this:

   /**
         * @return The activity under test.
         */
        public T getActivity() {
            if (mActivity == null) {
                Log.w(TAG, "Activity wasn't created yet");
            }
            return mActivity;
        }

      

Because when it getActivity()

returns an instance of Activity, it means that it should create an Activity. When the activity is created, it should create an Activity View. An activity type can only be created via UI Thread

.

@Before
    public void setUp() throws Exception {
        mainActivity = intentsTestRule.getActivity(); / *now Activity view gets created */
        /* Because Activity view creation happens in UI Thread, so all the test cases, here, are used by UI Thread */
    }

      

Now all test cases are inside the memory of the UI thread . Hence, you must explicitly use @UiThreadTest

for each test.

0


source







All Articles