我正在构建条形码扫描器,与其他实现不同,扫描部件在后台持续进行,而不是等待用户触发过程。
现在,实现这一目标的最明显的方法是在另一个线程中处理扫描部分,以确保主线程不会被中断。这样用户就不会对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秒)一次。