我的理解是Android检测的JUnit测试在他们自己的线程上运行,除非使用@UiThread
注释或调用Instrumentation.runOnMainSync()
或Activity.runOnUiThread()
。现在,我尝试使用CursorLoader
访问我应用的数据库并填充ListView
。我还有一个测试,用于验证ListView
是否填充正确。
我的问题是我需要同步三个线程:测试线程应该等到CursorLoader
线程完成并通知UI线程填充ListView
。要创建CursorLoader
,我使用支持LoaderCallbacks
注册LoaderManager
并在onCreateLoader()
中创建实例。然后onLoadFinished()
更改ListView
适配器的光标。
现在我需要确保在尝试访问onLoadFinish()
的子视图之前,我的测试会等到ListView
被调用。我目前的想法是在我的waitForData()
实现中添加LoaderCallbacks
方法,测试可以调用。但是,我不确定如何实现此方法。我可以在wait()
中使用notifyAll()
然后onLoadFinished()
吗?或者我是否需要使用像Semaphore
那样更复杂的东西?
答案 0 :(得分: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
答案 1 :(得分:0)
Espresso处理这种类型的同步。我还没有用它来弄清楚细节,但看起来很有希望。