Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 同步测试线程、UI线程和游标加载程序线程_Android_Multithreading_Testing_Android Listview_Synchronization - Fatal编程技术网

Android 同步测试线程、UI线程和游标加载程序线程

Android 同步测试线程、UI线程和游标加载程序线程,android,multithreading,testing,android-listview,synchronization,Android,Multithreading,Testing,Android Listview,Synchronization,我的理解是,Android插入指令的JUnit测试在它们自己的线程上运行,除非用@UiThread或调用或注释。现在我正试图使用游标加载程序访问我的应用程序的数据库并填充一个列表视图。我还有一个测试来验证ListView是否正确填充 我的问题是我需要同步三个线程:测试线程应该等到游标加载程序线程完成并通知UI线程填充ListView。要创建游标装入器,我向support LoaderManager注册一个LoaderCallbacks,并在onCreateLoader中创建实例。然后onLoad

我的理解是,Android插入指令的JUnit测试在它们自己的线程上运行,除非用@UiThread或调用或注释。现在我正试图使用游标加载程序访问我的应用程序的数据库并填充一个列表视图。我还有一个测试来验证ListView是否正确填充

我的问题是我需要同步三个线程:测试线程应该等到游标加载程序线程完成并通知UI线程填充ListView。要创建游标装入器,我向support LoaderManager注册一个LoaderCallbacks,并在onCreateLoader中创建实例。然后onLoadFinished更改ListView适配器的光标


现在,我需要确保在尝试访问ListView的子视图之前,我的测试会等待直到调用onLoadFinish。我目前的想法是向LoaderCallbacks实现中添加一个waitForData方法,测试可以调用该方法。但是,我不确定如何实现这个方法。我可以简单地使用等待,然后在onLoadFinished中通知所有人吗?或者我需要使用更复杂的东西,比如信号灯吗?

关于如何实现这一点,您的思路是正确的。通常的方法实际上是只阻塞主测试线程,直到工作线程完成。下面是一个示例,使用:


处理这种类型的同步。我还没有用它来找出细节,但它看起来很有希望。

谢谢你回答我的问题。对不起,我没有早点回复。我有一个问题:SessionStatus是什么?@Code学徒我记得这只是android API的一部分。测试中唯一相关的一点是使用侍者,它允许您的测试等待,直到您准备好继续,这可以在收到一些回调后进行。谷歌android SessionStatus不会导致对android API文档的点击,因此我得出结论,这是特定于此示例来自何处的自定义类。我也不确定如何将其应用到我现有的应用程序和测试框架中。SessionListener是与应用程序代码本身一起使用还是与测试一起使用?服务员在哪里?我在哪里叫服务员。等一下?你能提供一个更完整的例子吗?@Code学徒我不记得这个例子是从哪里来的,但是因为它让人分心,这里有一个更新的例子。这是未经测试的,但基本要点仍然存在。在单元测试中,创建一个服务生。打电话给服务员,等待阻止考试。然后给服务员打电话。当您准备好取消阻止测试时,从您的回拨中恢复。这是一个基本模式,适用于测试任何异步代码,而不管API是什么样子。感谢您在最新评论中给出的答案和说明。当我有机会的时候,我会看看这个。
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