服务于不同的过程

时间:2014-02-03 14:54:09

标签: android

我的应用程序显示大量图像并将其缓存在内存中,因此它使用大量内存(堆大小接近40MB)。另一方面,它下载大型7zip文件(300MB)并使用使用大量内存和处理的本机代码提取它们。有时候无法完成提取,但是在应用程序进程重新启动后它可以工作。虽然我没有得到任何例外,因为它的本机代码,我相信这是因为内存不足。

所以我决定将提取放在不同的过程中,这样我就可以在完成之后将其删除(这里新工艺的成本并不重要,因为首先工作更重要,提取本身就是耗费大量的处理器)。但是现在我在杀死进程之前必须检查是否还没有启动另一个提取。我想到了两个解决方案:

1-为每次提取开始一个全新的过程。 (我不知道它是否可能在android中)

2-以某种方式检查是否未启动另一次提取,如果没有,则终止该进程。 (这可能会导致内存不足)

3-不知怎的,等待提取完成后再开始新的提取。 (它非常复杂,因为它必须在不同的过程之间完成)

由于我无法弄清楚如何做到这一点,我真的需要专家建议。

- 编辑-------------------------------------------- ---

我检查了一个400MB的7zip文件。首次提取后,它总是失败。因此,必须在每次提取后杀死该进程并重新开始。所以第二个选项不在列表中!

为了记录,本机7zip代码不是我的,它是基于Linux的7ZA的Andro7Z,即使我自己编译了它,但我真的不想搞砸它。

2 个答案:

答案 0 :(得分:1)

好吧,如果你真的必须...你可以把你的提取放在Service里面,把Service放在一个单独的过程中。

您一次只允许一次提取(您可以自己控制)。如果您使用startService()开始提取,Android将确保您只运行一个Service实例。在onStartCommand()中,您应该检查是否已经进行了提取,如果是,您可以拒绝请求或将其排入数据库或其他任何位置。如果没有,则启动一个新线程进行提取。

一旦提取完成,该过程就会自行消失。下一次提取(使用startService())将导致Android创建新流程并启动Service的新实例。

答案 1 :(得分:0)

如果我理解你试图提取一些文件。我只会考虑Android代码,提取器代码可能包含内存泄漏。

但您可以使用AsyncTask类将此进程置于后台并在完成后接收回调。此外,如果您需要跟踪提取任务,您还可以使用任务实例列表,这样您就可以控制它们,并确切知道仍在运行的数量,或取消它们。

所以,我会创建类似的东西:

ExtractTaskController - 负责创建,管理和保存对任务的引用。 ExtractAsyncTask - 扩展AsyncTask类,并执行实际提取。