1

背景

我有一个简短而繁重的任务,它使用 NDK (JNI) 来进行一些位图操作。

在某些情况下,我需要取消任务并去做其他事情。

但是,由于该任务也使用了大量内存,并且最终还会创建一个大位图,这可能会导致内存不足错误。

问题

我应该如何取消包含本机代码的任务?对此有最佳做法吗?

也许某种我可以用于 C/C++ 的中断异常,以便一旦它被捕获,我至少可以释放所有内存?

也许我应该在本机代码中添加某种侦听器(观察者)?或者也许我应该调用一个我需要假设调用者拥有的方法?

4

2 回答 2

0

最简单的方法?

在线程上旋转任务。您可以在 Java 中旋转线程并从那里调用 JNI。它比 pthreads 更容易。

引入一个 volatile 标志(布尔变量),在任务启动时将其设置为 false。

在任务中,尽可能多地检查停止标志。如果为真,则放弃任务(您可能会抛出异常以通过多层函数嵌套返回,但您不必这样做)。

当你想取消时,从主线程设置标志。等待任务注意到这一点。

如果任务中最慢的部分是调用库/操作系统函数,这将无法正常工作——该函数不会检查标志。

C++ 中没有安全的内置机制来正确终止不想终止的代码线程(可能是信号,但它们会终止整个进程,而不是线程)。定期检查标志就是我所说的“想要被终止”。

于 2013-01-23T23:30:52.550 回答
0

我以前见过这种方法,我认为最好的方法是创建一个isCancelled()方法,您可以从本机代码定期调用该方法以确定何时停止。如果您正在使用AsyncTask,则该方法应该已经存在。

于 2013-01-23T23:31:34.843 回答