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

问题描述 投票:2回答: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 ();

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

android multithreading bitmap handler
2个回答
1
投票

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.