android - 尝试扫描条形码时Android应用程序崩溃
问题描述
我正在尝试使用我的应用程序扫描条形码,但每次出现错误时,我都无法理解。
这是错误:
2020-01-01 16:24:12.462 10754-10754/pl.komp.myapp I/CameraFramework: handleMessage: 16
2020-01-01 16:24:12.486 10754-10754/pl.komp.myapp I/zygote64: Deoptimizing void java.util.ArrayList.clear() due to loop bounds check elimination
2020-01-01 16:24:12.487 10754-10754/pl.komp.myapp D/AndroidRuntime: Shutting down VM
2020-01-01 16:24:12.487 10754-10754/pl.komp.myapp E/AndroidRuntime: [ERB] CRASH: main in pl.komp.myapp(10754)
2020-01-01 16:24:12.492 10754-10754/pl.komp.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: pl.komp.myapp, PID: 10754
java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at java.util.ArrayList.clear(ArrayList.java:569)
at android.view.ViewGroup.buildOrderedChildList(ViewGroup.java:4254)
at android.view.View.populateAccessibilityNodeInfoDrawingOrderInParent(View.java:8377)
at android.view.View.onInitializeAccessibilityNodeInfoInternal(View.java:8323)
at android.widget.TextView.onInitializeAccessibilityNodeInfoInternal(TextView.java:10667)
at android.view.View.onInitializeAccessibilityNodeInfo(View.java:7387)
at android.view.View.createAccessibilityNodeInfoInternal(View.java:7346)
at android.view.View.createAccessibilityNodeInfo(View.java:7331)
at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:146)
at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:119)
at android.view.View.onInitializeAccessibilityEventInternal(View.java:7283)
at android.widget.TextView.onInitializeAccessibilityEventInternal(TextView.java:10652)
at android.view.View.onInitializeAccessibilityEvent(View.java:7271)
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:7133)
at android.view.View.sendAccessibilityEventUnchecked(View.java:7118)
at android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:26422)
at android.os.Handler.handleCallback(Handler.java:869)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:206)
at android.app.ActivityThread.main(ActivityThread.java:6735)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)
这是活动代码:
public class ActivityReadBarcode extends BaseActivity
{
private SurfaceView _surfaceView;
private TextView _textViewValue;
private TextView _textViewFormat;
private CameraSource _cameraSource;
private BarcodeDetector _barcodeDetector;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_barcode_scanner);
_surfaceView = findViewById(R.id.surfaceBarcode);
_textViewValue = findViewById(R.id.lblBarcodeValue);
_textViewFormat = findViewById(R.id.lblBarcodeFormat);
_barcodeDetector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.ALL_FORMATS).build();
_cameraSource = new CameraSource.Builder(this, _barcodeDetector).setRequestedPreviewSize(640, 480).setAutoFocusEnabled(true).build();
_surfaceView.getHolder().addCallback(
new SurfaceHolder.Callback()
{
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder)
{
try
{
_cameraSource.start(surfaceHolder);
}
catch (IOException e)
{
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2)
{
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder)
{
if (_cameraSource != null)
{
_cameraSource.stop();
_cameraSource.release();
_cameraSource = null;
}
}
}
);
_barcodeDetector.setProcessor(
new Detector.Processor<Barcode>()
{
private int verifyRead = 0;
@Override
public void release()
{
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections)
{
SparseArray<Barcode> codes = detections.getDetectedItems();
if (codes.size() > 0)
{
String readValue = codes.valueAt(0).displayValue;
String lastValue = _textViewValue.getText().toString();
if (readValue.equals(lastValue))
verifyRead++;
_textViewFormat.setText(codes.valueAt(0).format);
_textViewValue.setText(readValue);
if (verifyRead > 10)
{
Intent intent = new Intent();
intent.putExtra("barcode_value", readValue);
setResult(RESULT_OK, intent);
finish();
}
}
else
{
verifyRead = 0;
_textViewFormat.setText("");
_textViewValue.setText("");
}
}
}
);
}
}
每次打开活动时都会发生错误。有时它会在 2 秒后出现,有时会在 5 分钟后出现(所以如果我足够快,我可以扫描条形码),但最终它会出现。
有人可以帮帮我吗?我在这里想念什么?
谢谢斯拉维克
解决方案
我找到了解决我的问题的方法,我想我会分享它。
我永远不应该直接从工作线程更新 UI。我应该在我的 TextView 字段上使用 View.post(Runnable) 方法:
_textViewFormat.post(new Runnable() { public void run() { _textViewFormat.setText(codes.valueAt(0).format); } });
_textViewValue.post(new Runnable() { public void run() { _textViewValue.setText(readValue); } });
_textViewFormat.post(new Runnable() { public void run() { _textViewFormat.setText(""); } });
_textViewValue.post(new Runnable() { public void run() { _textViewValue.setText(""); } });
上面显示的错误使我感到困惑。线程没有什么。这就是为什么长期以来我一直在错误的地方寻找解决方案。
推荐阅读
- css - 设置 flexbox 中子元素的最大数量
- verilog - 每个时钟将 n 位移出寄存器
- java - 如何使用 Spring 和 REST api 在数据库中上传图像?
- python - 未知层:DenseVariational。请确保将此对象传递给“custom_objects”参数
- python - 如何使用硒重定向到链接
- directory - 将多个子文件夹及其文件复制到 Python 中的新文件夹中
- ssh - Netcat 问题重新连接
- css - 如何设置 CSS Grid 行的样式?
- typescript - onReset 导致 RangeError: 超出最大调用堆栈大小
- python - 尝试在 Django 中为 CRUD 操作实例化模型中的记录出现错误“update_user() 缺少 1 个必需的位置参数:‘eid’