设置线程的运行级别,然后调用onStart方法。由于是通过InstrumentationTestRunner对象进入的调用,并且在InstrumentationTestRunner中对Instrumentation的onStart方法进行了重写,所以调用的是InstrumentationTestRunner的onStart方法,所以这时对onStart方法的执行是在新生成的“Instr: android.test.InstrumentationTestRunner”线程中。onStart代码如下
@Override public void onStart() { prepareLooper(); if (mJustCount ) { mResults.putString(Instrumentation. REPORT_KEY_IDENTIFIER , REPORT_VALUE_ID ); mResults.putInt( REPORT_KEY_NUM_TOTAL , mTestCount ); finish(Activity. RESULT_OK , mResults ); } else { if (mDebug ) { Debug. waitForDebugger(); } ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream writer = new PrintStream(byteArrayOutputStream); try { StringResultPrinter resultPrinter = new StringResultPrinter(writer); mTestRunner .addTestListener(resultPrinter); long startTime = System.currentTimeMillis(); mTestRunner .runTest(); long runTime = System.currentTimeMillis() - startTime; resultPrinter.print( mTestRunner .getTestResult(), runTime); } catch (Throwable t) { // catch all exceptions so a more verbose error message can be outputted writer.println(String. format( "Test run aborted due to unexpected exception: %s", t.getMessage())); t.printStackTrace(writer); } finally { mResults.putString(Instrumentation. REPORT_KEY_STREAMRESULT , String. format( "\nTest results for %s=%s", mTestRunner .getTestClassName(), byteArrayOutputStream.toString())); if (mCoverage ) { generateCoverageReport(); } writer.close(); finish(Activity. RESULT_OK , mResults ); } } } |
这主要是执行测试用例,收集结果了。这也就解释了为什么测试用例执行的线程与activity运行线程不一致的了。那activity运行的线程呢?onStart方法最后调用了finish,代码如下
public void finish(int resultCode, Bundle results) { if (mAutomaticPerformanceSnapshots ) { endPerformanceSnapshot(); } if (mPerfMetrics != null) { results.putAll( mPerfMetrics ); } mThread.finishInstrumentation(resultCode, results); } |
其中有对mThread对象的使用,这是一个ActivityThread类型的对象,是Instrumentation类的私有属性,在Instrumentation类的init方法中,有对mThread字段的赋值,并且只在这里有对mThread字段的赋值操作,猜测它就代表着activity运行所在的线程,也就是UI thread。所以反推,init方法应该在OnCreate方法调用之前。