2

我的理解是,Android儀器化JUnit測試在自己的線程上運行,除非用@UiThread註釋或調用Instrumentation.runOnMainSync()Activity.runOnUiThread()。現在我試圖使用CursorLoader來訪問我的應用程序的數據庫並填充ListView。我也有一個測試,驗證ListView正確填充。同步測試線程,UI線程和CursorLoader線程

我的問題是,我需要同步三個線程:測試線程應該等到CursorLoader線程完成並通知UI線程填充ListView。要創建一個CursorLoader,我在的支持下注冊LoaderCallbacks,並在onCreateLoader()中創建實例。然後onLoadFinished()更改ListView的適配器的光標。

現在我需要確保在嘗試訪問ListView的子視圖之前,我的測試一直等到onLoadFinish()被調用。我目前的想法是添加一個waitForData()方法到我的LoaderCallbacks實現,測試可以調用。但是,我不確定如何實現這種方法。我可以簡單地使用wait()然後notifyAll()onLoadFinished()?或者我需要使用更復雜的東西,比如Semaphore

回答

0

您正處在如何解決這個問題的正確軌道上。一般的方法的確是阻止主測試線程,直到完成工作線程。下面是使用ConcurrentUnit一個例子:

final Waiter waiter = new Waiter(); 

LoaderManager.LoaderCallbacks callbacks = new LoaderManager.LoaderCallbacks() { 
    public void onLoadFinished(Loader<D> loader, D data) { 
    waiter.assertEquals(someValue, "foo"); 
    waiter.resume(); 
    } 

    //... 
}; 


// register callbacks... 

waiter.await(5000); // wait 5 seconds for resume 
+0

感謝您回答我的問題。對不起,我沒有早點回復。我有一個問題:什麼是'SessionStatus'? –

+0

@ Code-Apprentice如果我記得,它只是android API的一部分。測試的唯一相關位是使用「服務員」,它允許您的測試等待,直到您準備好恢復,這可能是在收到一些回調之後。 – Jonathan

+0

使用Google搜索「android SessionStatus」不會對Android API文檔造成衝擊,所以我得出結論,這是自定義類,無論這個例子來自哪裏。我也不確定如何將它融入到我現有的應用程序和測試框架中。 'SessionListener'是否與應用程序代碼一起或與測試一起使用? 「服務員」在哪裏申報?我在哪裏可以調用'waiter.await()'?你能提供一個更完整的例子嗎? –

0

Espresso處理這種類型的同步。我還沒有弄清楚細節,但看起來很有希望。