0

私は画像処理の Android アプリケーションに取り組んでいます。時間のかかる関数を提供し、独自のメモリを割り当てる C++ シングルトン オブジェクトがあるとします。さらに、C++ ライブラリには、時間のかかる作業を行う他の関数もいくつか用意されています。この関数は、シングルトン オブジェクトによって呼び出されます。独自の一時メモリ (関数の終了時に解放される) を割り当てることができ、シングルトン オブジェクトとデータを交換する必要があります。ワークフローは次のとおりです。

  1. ネイティブ C++ ライブラリが読み込まれ、シングルトン オブジェクトが作成されます (メモリが割り当てられ、アセット ディレクトリからデータが読み込まれます)。
  2. ユーザーは、アプリケーション インターフェイスを使用して、画像を選択して読み込みます
  3. 画像は、いくつかの情報を計算するシングルトン オブジェクトに渡されます
  4. ユーザーは特定の画像処理アルゴリズムを要求でき、シングルトン オブジェクトは対応する関数を呼び出すように要求されます。
  5. 4 から繰り返すか、ユーザーが別のイメージをロードした場合は 2 に進みます (シングルトン オブジェクトはリセットされます (ステップ 1 で割り当てられたメモリは、アプリケーションが終了するまで保持されます))。

ステップ 2 と 3 は、アプリの中で最も時間がかかる部分です。時間がかかりすぎた場合にユーザーが現在の処理を停止できるようにし、時間のかかる処理アルゴリズムの間、アプリケーションの応答性を維持できるようにしたいと考えています。このアプリを実行する最も簡単な方法は、ネイティブ関数を呼び出して待機することですが、これはおそらく UI をブロックします。もう 1 つの方法は、これらの関数を設計して、処理された N ピクセルごとにフラグをチェックし、関数を停止する必要があるかどうかを確認することです (これにより、停止が発生したときにメモリを解放できます)。3 番目のオプションは、Java スレッドを使用することですが、どうすればよいでしょうか?

4

1 に答える 1

2

時間のかかるタスクをUIスレッドから実行する必要があります。ネイティブスレッドでこれを行うこともできますが、Javaのバックグラウンドスレッドからネイティブ関数を呼び出す方が簡単です。非同期タスクなど、いくつかの方法でそれを行うことができます。

時間のかかる操作を開始するときは、UIにある種のビジーインジケーターをユーザーに表示する必要があります。UIスレッドは応答性を維持する必要があります(つまり、ユーザーは「戻る」または「ホーム」にすることができます)が、必要に応じて他のほとんどのコントロールを無効にすることができます。

あなたが提案したように、バックグラウンドスレッドでのネイティブ操作は、停止要求フラグを定期的にチェックします。おそらく、そのネイティブフラグを作成し、UIスレッドから呼び出される別の(簡単な)ネイティブ関数を使用して設定するのが最も簡単です。それをjavaフラグにし、Cからjavaを呼び出してチェックするオプションがありますが、それはもっと複雑に思えます。

処理に特に時間がかかる場合は、おそらくバックグラウンドで作業を行うだけでなく、アクティビティではなくAndroidサービスのコンテキストで作業を行う必要があります。最初の概算では、ネイティブコードは違いを気にしませんが、処理中にアクティビティがバックグラウンドに移動した場合、つまり作業がサービスで行われている場合(より具体的には、プロセスにアクティブなサービス)、Androidは可能であれば実行を継続させようとします。対照的に、他の何かがフォアグラウンドにあるためにプロセスに現在アクティブではないアクティビティしかない場合、Androidはプロセスを強制終了するか、使用可能なCPUを制限する可能性が高くなります。最終的には、ネイティブコードを実行する場合は、作業が完了する前にプロセスが強制終了される可能性に対処する必要があります。つまり、ユーザーがアクティビティをに返すときに新しいプロセスが作成されたときに、そのような状態から回復できる必要があります。フォアグラウンド。フラグがonDestroy()呼び出しのネイティブコードにその作業を保存するためのアラートとして通知できるようにすることも役立つ可能性がありますが、それでも、その通知の礼儀。

于 2012-12-08T14:52:06.400 に答える