如何从后台线程向主线程发送位图数据?

时间:2013-07-24 10:25:20

标签: android multithreading bitmap handler

我正在创建一个面部检测应用程序并减少主要线程上的工作负载我正在使用后台线程。代码如下。

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 ();

现在,我知道保存图像部分应该在主线程中完成。现在我不知道的是,如何将'bitmap bmp'发送到主线程?

2 个答案:

答案 0 :(得分:1)

定义BroadcastReceiver并从您的工作线程发送Intent,因为BitmapParcelable。如果要启动新活动来处理位图,也可以使用startIntent,因此您不需要定义BroadcastReceiver。或者在主线程中定义Handler,将其传递给工作线程,然后在主线程上发布Runnable以执行。您也可以使用runOnUiThread()

答案 1 :(得分:1)

推荐的方法是使用AsyncTask。它允许您在后台线程中完成一些工作,然后在主线程上获得结果。查一查,如何使用它将是显而易见的。

顺便说一句,我不明白你为什么要在主线程上保存位图。这是一个缓慢的操作,也应该在后台线程中完成。只应在主线程中显示图像(或其他UI交互)。