You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,且线程同步操作需要严格的锁机制,新手容易出错)。推荐用计数器+回调触发下一次扫描的方式:

  1. 添加成员变量记录扫描次数
  2. 在扫描完成的回调中,判断是否继续扫描,满足条件则自动启动下一次预览

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:55:28