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

定义 a并从您的工作线程BroadcastReceiver发送一个,因为is 。如果你想启动一个新的活动来处理位图,你也可以使用 startIntent,这样你就不需要定义一个 BroadcastReceiver。或者在你的主线程中定义一个,将它传递给你的工作线程,然后发布一个在主线程上执行。您也可以使用.IntentBitmapParcelableHandlerRunnablerunOnUiThread()

于 2013-07-24T10:30:07.310 回答