Android:如何等待二维码扫描完成后在主线程中继续下一次扫描
实现code-scanner库的连续多次二维码扫描
我是Android开发新手,使用code-scanner二维码扫描库,现有单次扫描代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CodeScannerView scannerView = findViewById(R.id.scanner_view); mCodeScanner = new CodeScanner(this, scannerView); mCodeScanner.setDecodeCallback(new DecodeCallback() { @Override public void onDecoded(@NonNull final Result result) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, result.getText(), Toast.LENGTH_SHORT).show(); } }); } }); scannerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCodeScanner.startPreview(); } }); }
目前已实现单次扫描获取结果,现在需要完成10次连续扫描,要求每次扫描完成后再启动下一次扫描。我尝试用for循环实现,但无法等待上一次扫描完成就直接执行了下一次:
for(int i =0;i<10;i++) { mCodeScanner.startPreview(); // 这里无法等待扫描完成就进入下一次循环 }
之后尝试用wait()和notify()方法同步线程,但程序在wait()处直接崩溃,无报错信息,仍未解决问题。
解决方案:基于回调的连续扫描实现
这个库的扫描是异步回调模式,不能用同步的for循环或wait()/notify()阻塞线程(UI线程阻塞会导致ANR,且线程同步操作需要严格的锁机制,新手容易出错)。推荐用计数器+回调触发下一次扫描的方式:
- 添加成员变量记录扫描次数
- 在扫描完成的回调中,判断是否继续扫描,满足条件则自动启动下一次预览
修改后的完整代码:
public class MainActivity extends AppCompatActivity { private CodeScanner mCodeScanner; // 记录已完成的扫描次数 private int completedScans = 0; // 目标扫描次数 private static final int TOTAL_SCANS = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CodeScannerView scannerView = findViewById(R.id.scanner_view); mCodeScanner = new CodeScanner(this, scannerView); mCodeScanner.setDecodeCallback(new DecodeCallback() { @Override public void onDecoded(@NonNull final Result result) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, result.getText(), Toast.LENGTH_SHORT).show(); completedScans++; // 判断是否还需要继续扫描 if (completedScans < TOTAL_SCANS) { // 启动下一次扫描 mCodeScanner.startPreview(); } else { // 扫描次数达标,可以做收尾操作 Toast.makeText(MainActivity.this, "10次扫描完成", Toast.LENGTH_LONG).show(); } } }); } }); scannerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 点击时重置计数器并开始第一次扫描 completedScans = 0; mCodeScanner.startPreview(); } }); } @Override protected void onResume() { super.onResume(); // 页面恢复时可以按需启动扫描 if (completedScans < TOTAL_SCANS) { mCodeScanner.startPreview(); } } @Override protected void onPause() { // 页面暂停时停止扫描,避免资源浪费 mCodeScanner.releaseResources(); super.onPause(); } }
关键说明:
- 用
completedScans计数器跟踪已完成的扫描次数,每次扫描成功后自增 - 在
onDecoded的UI线程操作中,判断是否未达到目标次数,若是则直接调用startPreview()启动下一次扫描 - 移除了同步阻塞的逻辑,完全基于异步回调驱动,符合Android的线程模型,避免ANR和线程同步错误
内容的提问来源于stack exchange,提问作者Raize Ahamed
相关产品推荐
相关产品推荐

