2

私は顔検出アプリを作成しており、バックグラウンド スレッドを使用しているメイン スレッドの負荷を軽減しています。コードを以下に示します。

Thread background = new Thread(new Runnable() {

    public void run() {

    Log.d ("Thread", "Thread has started");

    for (Feature feat : mClassifierFiles.keySet()) {
        mFaces.put(feat, cvHaarDetectObjects(grayImage,  mClassifiers.get(feat), mStorages.get(feat), 1.1, 3,
                        CV_HAAR_DO_CANNY_PRUNING));

        if (mFaces.get(feat).total() > 0) {

            Size previewSize = camera.getParameters().getPreviewSize(); 
            YuvImage yuvimage=new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);
                byte[] jdata = baos.toByteArray();
            Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
            saveImg(bmp);

            }

    postInvalidate();
    opencv_core.cvClearMemStorage(mStorages.get(feat));

    }
     }
 });

 background.start ();

これで、画像の保存部分はメインスレッドで行う必要があることがわかりました。今私が得られないのは、「ビットマップbmp」をメインスレッドに送信する方法ですか?

4

2 に答える 2

2

推奨される方法は、AsyncTask を使用することです。バックグラウンド スレッドで何らかの作業を行い、メイン スレッドで結果を取得できます。それを見て、それを使用する方法は明らかです。

ところで、メイン スレッドでビットマップの保存を行う必要がある理由がわかりません。これは処理が遅く、バックグラウンド スレッドでも実行する必要があります。画像 (またはその他の UI インタラクション) の表示のみをメイン スレッドで行う必要があります。

于 2013-07-24T10:32:24.003 に答える
1

は であるため、 を定義して、ワーカー スレッドからをBroadcastReceiver送信します。新しいアクティビティを起動してビットマップを処理する場合は、startIntent を使用することもできるため、BroadcastReceiver を定義する必要はありません。または、メイン スレッドで を定義し、それをワーカー スレッドに渡してから、メイン スレッドで実行されるように投稿します。も使用できます。IntentBitmapParcelableHandlerRunnablerunOnUiThread()

于 2013-07-24T10:30:07.310 に答える