同步测试线程,UI线程和CursorLoader线程

时间:2015-06-14 04:20:43

标签: android multithreading testing android-listview synchronization

我的理解是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那样更复杂的东西?

2 个答案:

答案 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处理这种类型的同步。我还没有用它来弄清楚细节,但看起来很有希望。