OpenCV のカスタムである処理スレッドから Android トーストを作成する必要があるため、ここで提案されているように runOnUiThread() を使用できません: Android: Toast in a thread。
このコードのほとんどは、CVCamera サンプル アプリからのものです。しかし、なじみのない方のために、Surf メニュー ボタンを選択すると、SURFProcessor が次のように呼び出されます。
else if (item.getTitle().equals("SURF")) {
defaultcallbackstack.addFirst(new SURFProcessor());
toasts(DIALOG_TUTORIAL_SURF, "");
}
このプロセッサ スレッドは、電話のカメラ ボタンを押すと (capturePress = true)、画像が撮影され、処理が完了するように実行されます。示されているように toasts メソッドを呼び出したい:
class SURFProcessor implements NativeProcessor.PoolCallback {
@Override
public void process(int idx, image_pool pool, long timestamp,
NativeProcessor nativeProcessor) {
if(capturePress) {
String processMsg = processor.processFeatures(idx, pool, cvcamera.DETECT_SURF);
capturePress = false;
toasts(PROCESS_MESSAGE, processMsg);
}
}
}
Activity を拡張するメイン クラスにある toasts メソッドを次に示します。
void toasts(int id, String msg) {
switch (id) {
case PROCESS_MESSAGE:
Toast.makeText(MMRapp.this, msg, Toast.LENGTH_LONG).show();
break;
.........
現在、このコードは「Looper.prepare() を呼び出していないスレッド内でハンドラを作成できません」というエラーを表示します。toasts メソッドを呼び出すにはどうすればよいですか? または、toasts メソッドに processMsg の変更をリッスンさせることは可能ですか? 可能であれば、代わりに processMsg を送信するか、クラス変数を変更することで問題を解決できます。要するに、このプロセッサ スレッドから更新された文字列が必要です。
ありがとうございました。必要に応じて、より多くの情報/コードを提供します。
-トム