【问题标题】:Android: Only the original thread that created a view hierarchy can touch its views - UnitTestAndroid:只有创建视图层次结构的原始线程才能触摸其视图 - UnitTest
【发布时间】:2014-11-05 10:12:25
【问题描述】:

我正在为小应用程序设计 UnitTest。这个应用程序计算出您使用的出生日期是什么命理号码。我有一个问题,我要调用检查数字并将值放入 TextView 的方法。我有一个错误

`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)

`

我的布局: `

  <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>`

我想测试的方法: `

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's hard to get a compromise, they prefer to impose their views and way of seeing.");
        }`

【问题讨论】:

  • 正如错误所说,您正在从非 ui 线程访问 ui 线程

标签: android


【解决方案1】:

我在测试方法之前用注解 @UiThreadTest 解决了这个问题。

【讨论】:

    【解决方案2】:

    将你设置值的代码放到一个新线程中;

      Handler h=new Handler();
      h.post(new Runnable() {
            public void run() {
    
            textView.setText(value);
            }
       });
    

    看起来你的文本视图是 finInformation 在 run() 中使用它;

    【讨论】:

    • 我在测试方法之前通过注释@UiThreadTest 解决了这个问题。感谢您的快速回答:)
    【解决方案3】:

    getActivity() 实现如下:

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

    既然getActivity()返回Activity实例,就意味着它必须创建Activity。当 Activity 被创建时,它必须创建 Activity 的 View。 Activity 的 View 只能通过UI Thread 创建。

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

    现在,每个测试用例都在 UI Thread 的内存中。因此,您应该为每个测试显式使用@UiThreadTest

    【讨论】:

      【解决方案4】:

      对于 React Native 关闭性能监视器

      【讨论】:

        猜你喜欢
        • 2016-01-17
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        相关资源
        最近更新 更多