AsyncTasks之间的对象(或消息)交换已经开始

时间:2014-12-30 13:21:46

标签: java android multithreading opencv android-asynctask

我有三个AsyncTask:第一个捕获图像帧(每秒多于一个)Mat类型,并应将其传递给第二个AsyncTask。第二个处理帧,如果有必要,它应该传达第三个AsyncTask来拍照。

如何管理已启动的AsyncTasks之间的通信我的想法是使用静态对象,但它似乎不是一个“优雅”的解决方案。

PS:如果他们与对象进行通信会更好,但我也接受如何传达简单消息的提示。

谢谢

1 个答案:

答案 0 :(得分:0)

您的方法存在一些难以解决的问题:

1)Mat对象在内存和分配时间方面非常昂贵,因此如果你在AsyncTask运行时每秒捕获几帧并将它们保存在内存中,你最终会得到OutOfMemory异常;

2)在某些Android版本上,所有AsyncTasks都在同一个线程上运行,这意味着它们实际上会按顺序运行。在最好的情况下,有一个用于运行AsyncTasks的线程池,这意味着你将有一定数量的正在运行的任务。

我建议您在onCameraFrame(CvCameraViewFrame inputFrame)内进行所有处理。但我想你已经尝试过了,并且处理时间很长,以显示具有足够FPS的预览。

要严格回答您的问题,您可以使用AsyncTasks的事件总线通信系统。我使用过Otto,它很容易设置,并且有很多例子(http://square.github.io/otto/)。这是使用Otto(http://simonvt.net/2014/04/17/asynctask-is-bad-and-you-should-feel-bad/)的一个很好的例子。只需确保为每个任务响应创建单独的类文件,否则您将获得消耗彼此消息的任务。

但是,如果您想继续使用您的方法,我建议您使用线程和相互通信。周围有很多简单的例子。