我现在写了一个测试类继承了ActivityInstrumentationTestCase2, 我只能利用sendKeys()方法模拟手机键的输入模拟UI的按键的事件。可我希望能测试用户在屏幕上滑动组件的效果,如何模拟呢?是使用Instrumentation.sendPointerSync()这个方法来实现吗?我的测试方法如下:MonthModel currentMonth = activity.getCurrentMonth();
                final Instrumentation instrumentation = this.getInstrumentation();
                assertNotNull(instrumentation);
                long firstTime = SystemClock.uptimeMillis();
                final MotionEvent firstEvent = MotionEvent.obtain(firstTime, firstTime,
                                MotionEvent.ACTION_DOWN, 100, 170, 0);
                long secondTime = SystemClock.uptimeMillis();                final MotionEvent secondEvent = MotionEvent.obtain(secondTime,
                                secondTime, MotionEvent.ACTION_UP, 100, 340, 0);
                activity.runOnUiThread(new Runnable() {                        @Override
                        public void run() {
                                // TODO Auto-generated method stub
                                instrumentation.sendPointerSync(firstEvent);
                                instrumentation.sendPointerSync(secondEvent);
                        }                });                currentMonth = currentMonth.gotoPreviousMonth();
                assertEquals(currentMonth, activity.getCurrentMonth());不考虑业务逻辑,当我执行这个方法的时候,会产生如下的异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
at android.view.View.requestLayout(View.java:8125)
at android.view.View.setLayoutParams(View.java:4860)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:188)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Activity.onWindowAttributesChanged(Activity.java:1974)
at android.view.Window.setFlags(Window.java:638)
at android.view.Window.addFlags(Window.java:603)
at com.cybercom.canlendarApp.test.activity.CalendarAppTest.setUp(CalendarAppTest.java:37)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
希望有高手能为我解答疑惑,谢谢哈。

解决方案 »

  1.   

    ???你不是说测试OnFling()么?你就发了一个ACTION_DOWN和ACTION_UP,没move啊,没move怎么触发onfling啊
      

  2.   


    谢谢回复,这也是我其中一个疑问哈,我不清楚怎么去模拟这个引起onFling的事件,以及如何把它和拖动事件区别开来?我现在加了一个Move的事件,但是仍然产生上面的那个异常,可见,问题关键跟线程有关,我查了一下,可能是与某些应该在主线程上执行的逻辑在其他线程上执行产生了这个异常,可我不清楚我的代码上哪方面出了这个问题?
      

  3.   

    现在这个问题解决了,没有异常出现了,可问题是onFling()方法没有触发。希望有高手能告诉我如何模拟事件触发onFling()方法,谢谢了
      

  4.   

    出现这个问题的原因是我在测试类的setup() 方法中有这样的代码: activity.getWindow().addFlags(
    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    我把它注释了之后在执行测试,就没有异常抛出了,可问题是onFling()方法仍然没有触发, 如何解决呢?