1

バックグラウンド

ビットマップ操作を行うために NDK (JNI) を使用する、短いながらも重いタスクがあります。

場合によっては、タスクをキャンセルして他の作業に取り掛かる必要があります。

ただし、タスクも大量のメモリを使用し、最終的には大きなビットマップも作成するため、メモリ不足エラーが発生する可能性があります。

質問

ネイティブ コードを含むタスクをキャンセルするにはどうすればよいですか? これに対するベストプラクティスはありますか?

C/C++ で使用できるある種の中断された例外で、それがキャッチされるとすぐに、少なくともすべてのメモリを解放できるでしょうか?

ネイティブ コードにある種のリスナー (オブザーバー) を追加する必要があるのではないでしょうか? それとも、呼び出し元が持っていると想定する必要があるメソッドを呼び出す必要がありますか?

4

2 に答える 2

0

最も簡単な方法は?

スレッドでタスクをスピンします。Java でスレッドをスピンし、そこから JNI を呼び出すことができます。pthreads よりも簡単です。

volatile フラグ (ブール変数) を導入し、タスクの起動時に false に設定します。

タスクでは、できるだけ頻繁に停止フラグを確認してください。true の場合、タスクを破棄します (いくつかのレベルの関数の入れ子を介して戻るために例外をスローする場合がありますが、そうする必要はありません)。

キャンセルしたい場合は、メインスレッドからフラグを立ててください。タスクがそれに気付くのを待ちます。

タスクの最も遅い部分がライブラリ/OS 関数を呼び出している場合、これはうまく機能しません。その関数はフラグをチェックしません。

C++ には、終了させたくないコードのスレッドを正しく終了するための安全な組み込みメカニズムはありません (シグナルかもしれませんが、スレッドではなくプロセス全体を強制終了します)。フラグを定期的にチェックすることは、「終了したい」という意味です。

于 2013-01-23T23:30:52.550 に答える
0

isCancelled()以前にこのアプローチが使用されているのを見たことがありますが、いつ停止するかを判断するために、ネイティブ コードから定期的に呼び出すことができるメソッドを作成するのが最善のアプローチだと思います。を使用している場合AsyncTask、そのメソッドは既に存在しているはずです。

于 2013-01-23T23:31:34.843 に答える