0

我正在开发一个图像处理 Android 应用程序。假设您有一个 C++ 单例对象,它提供了一些耗时的函数并分配了自己的内存。此外,C++ 库还将提供一些其他功能,这些功能也会执行一些耗时的工作。此函数将由单例对象调用。他们可以分配自己的临时内存(将在函数终止时释放)并且需要与单例对象交换数据。工作流程如下:

  1. 加载本地 C++ 库,创建单例对象(它将分配内存并从资产目录加载数据)。
  2. 用户,使用应用程序界面,选择图像并加载它
  3. 图像被传递给将计算一些信息的单例对象
  4. 用户可以请求特定的图像处理算法,要求单例对象调用相应的函数
  5. 如果用户加载另一个图像,则从 4 重复或转到 2(将重置单例对象(在步骤 1 中分配的内存将保留到应用程序终止))。

第 2 步和第 3 步是应用程序中最耗时的部分。我希望用户能够在时间过长时停止当前处理,并且应用程序在耗时的处理算法期间保持响应。执行此应用程序的最简单方法是调用本机函数并等待,但这可能会阻塞 UI。另一种方法是设计这些函数来检查每 N 个处理像素的标志,以了解该函数是否必须停止(这将允许我在它发生时释放内存)。第三种选择可能是使用 java 线程,但是如何使用呢?

4

1 回答 1

2

您将不得不从 UI 线程运行耗时的任务。您可以使用本机线程执行此操作,但从 java 中的后台线程调用本机函数会更简单 - 您可以通过多种方式来执行此操作,例如异步任务等,您可以阅读相关内容。

当您开始耗时的操作时,您会希望 UI 向用户显示某种忙碌指示符。UI 线程必须保持响应(即用户可以“返回”或“主页”),但如果您愿意,您可以禁用大多数其他控件。

正如您所建议的,您在后台线程中的本机操作会定期检查停止请求标志。您可能会发现将其设为本地标志并使用从 UI 线程调用的另一个(简短)本地函数设置它是最简单的;可以选择将其设置为 java 标志并从 C 调用 java 来检查它,但这似乎更复杂。

如果您的处理将特别冗长,可以说您不仅应该在后台进行工作,还应该在 Android 服务而不是活动的上下文中进行工作。大致而言,本机代码不会关心差异,但是如果活动在处理期间进入后台会发生什么 - 如果工作正在服务中完成(或者更具体地说,如果流程包含一个处于活动状态的服务),Android 将尽可能让它继续运行。相反,如果该进程只有一个活动,而该活动现在因为其他东西在前台而不活动,Android 更有可能杀死它或限制其可用的 CPU。最终,无论您做什么,您的本机代码都需要处理在工作完成之前其进程被终止的可能性 - 即,当用户将您的活动返回到创建新进程时,您必须能够从这种状态中恢复前景。让您的标志也能够通知 onDestroy() 调用的本机代码作为保存其工作的警报可能会有所帮助,但它仍然需要能够从被杀死的情况下恢复(至少干净地重做)该通知的礼貌。

于 2012-12-08T14:52:06.400 回答