2012-03-14 12 views
6

मेरा परीक्षण एक AsyncTask को पूरा करने और मान्य करने पर केंद्रित है कि बाद की गतिविधि शुरू हो गई है।ActivityUnitTestCase और गतिविधि # runOnUiThread

यह जाना जाता है कि AsyncTask # onPostExecute लागू नहीं है जब तक कि AsyncTask instantiated और यूआई धागे से क्रियान्वित किया जाता है, इसलिए मेरे (परीक्षण दृश्य) AsyncTask आह्वान करने के लिए विधि इस व्यवहार सुनिश्चित करने के लिए आवश्यक सावधानियों के माध्यम से चला जाता है - एक Runnable के माध्यम से जो यूआई थ्रेड पर तुरंत चलता है या यूआई थ्रेड पर चलाने के लिए निर्धारित है।

जब यह विधि किसी गतिविधिUnitTestCase परीक्षण से आती है, तो रननेबल जो गतिविधि के रूप में इस AsyncTask को तत्काल और निष्पादित करता है # runOnUiThread UI थ्रेड के अलावा किसी अन्य थ्रेड पर चल रहा है। क्या यह सुनिश्चित करने का कोई तरीका है कि यह रननेबल गतिविधि के भीतर से यूआई थ्रेड पर निष्पादित करेगा?

अनुशेष:

  • परीक्षण के रूप में एक ActivityInstrumentationTestCase2 वर्ग के अंतर्गत आशा व्यक्त की चलाता है, लेकिन मैं ActivityUnitTestCase # getStartedActivityIntent के लिए उपयोग नहीं है। मुझे इंस्ट्रुमेंटेशन के बारे में पता है। सक्रियता मॉनिटर और यह एक गैर-समाधान है।
  • ActivityUnitTestCase # runTestOnUiThread पर चलने वाले रननेबल्स UI थ्रेड पर चलते पर चलते हैं।
  • मैं अपने परीक्षण को फिर से परिभाषित नहीं कर रहा हूं।
  • विचित्र रूप से पर्याप्त, ActivityUnitTestCase # startActivity कॉल गतिविधि # UI UI थ्रेड पर नहीं बनाएं।

संपादित करें:

// ExampleActivityTests.java 

class ExampleActivityTests : public ActivityUnitTestCase <ExampleActivity> { 

    public void testThatRequiresUiThread() { 

     startActivity (new Intent(), null, null); 
     // ...call instrumentation onStart, onResume... 

     runTestOnUiThread(new Runnable() { 
      public void run() { 
       boolean isUiThread = Thread.currentThread() == Looper.getMainLooper().getThread(); 
       Log.d ("A", "Running on UI Thread? " + isUiThread); 
      } 
     }); 

     getActivity().methodRequiringUiThread(); 

     // assertions here... 
    } 
} 

// ExampleActivity.java -- just the relevant method 

    public void methodRequiringUiThread() { 

     runOnUiThread(new Runnable() { 
      public void run() { 
       boolean isUiThread = Thread.currentThread() == Looper.getMainLooper().getThread(); 
       Log.d ("B", "Running on UI Thread? " + isUiThread); 
      } 
     }); 
    } 

LogCat में हम देखेंगे:

A | Running on UI Thread? true 
B | Running on UI Thread? false 
+1

एक छोटी सी अपने बयान _ पढ़ने से उलझन बिट "एक Runnable के माध्यम से है कि तुरंत यूआई धागे पर अगर चलाता है या यूआई धागे पर चलने के लिए निर्धारित" _, बेहतर संलग्न करने के लिए आपकी समस्या को स्पष्ट करने के लिए कुछ कोड स्निपेट। – yorkw

+0

हो सकता है कि वह कथन कार्यान्वयन की बहुत अधिक जानकारी दे रहा था - इसका उद्देश्य केवल घर चलाने के लिए था कि मैं वास्तव में यह सुनिश्चित कर रहा हूं कि AsyncTask को यूआई थ्रेड पर बनाया और निष्पादित किया गया हो। मैं उस कोड को जोड़ सकता हूं जो मुझे सामना कर रही समस्या का प्रदर्शन करता है, लेकिन मैं इस पहलू को छोड़कर ऐसा करूँगा। – Travis

उत्तर

4

पर ActivityUnitTestCase # startActivity कॉलिंग यहाँ है कि समस्या का सार को दर्शाता है (untested) कोड का एक सा यूआई धागा मेरी समस्या हल करता है।

public void testThatRequiresUiThread() { 

    runTestOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      startActivity(new Intent(), null, null); 
     } 
    }); 

    // ... 
    getActivity().methodRequiringUiThread(); 

    // rest of test... 
} 

पैदावार

A | Running on UI Thread? true 
B | Running on UI Thread? true 
संबंधित मुद्दे