Android

时间:2015-05-19 07:41:29

标签: java android multithreading

我正在构建条形码扫描器,与其他实现不同,扫描部件在后台持续进行,而不是等待用户触发过程。

现在,实现这一目标的最明显的方法是在另一个线程中处理扫描部分,以确保主线程不会被中断。这样用户就不会对UI滞后,口吃等等感到困扰。

在并发方面,我不是最聪明的人。但是我做了我的功课并做了一些关于它的研究,这反过来引导我写这个:

...
mScannerExecutor = Executors.newFixedThreadPool(3);
...

Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera camera) {
        Camera.Parameters parameters = camera.getParameters();
        Camera.Size size = parameters.getPreviewSize();

        final Image barcode = new Image(size.width, size.height, "Y800");
        barcode.setData(data);

        Runnable scan = new Runnable() {
            @Override
            public void run() {
                int result = mBarcodeScanner.scanImage(barcode);
                if (result != 0) {
                    if(isInPreview) {
                        isInPreview = false;
                        mCamera.stopPreview();
                    }

                    SymbolSet symbolSet = mBarcodeScanner.getResults();
                    mListener.onBarcodeScanned(symbolSet.iterator().next());
                    if (enableRepeatedScanning) {
                        new Handler().postDelayed(restartPreview, mRescanIntervalMillis);
                    }
                 }
            }
        };
        mScannerExecutor.execute(scan);
    }
};

但是上面的代码在执行时导致了很多错误。我甚至不能让应用程序运行超过几秒钟。错误消息时常变化,但下面显示的最多:

Fatal signal 8 (SIGFPE), code -6, fault addr 0x17b8 in tid 6410 (pool-1-thread-1)

我有一种强烈的感觉,这种设计一般都存在严重缺陷。因此不断崩溃。

我能做些什么才能做到这一点?我错过了一些非常重要的东西吗?

p.s。, 上面定义的previewCallback经常被称为非常;每2000毫秒(2秒)一次。

0 个答案:

没有答案