如何实现多个Google MLKit TextRecognition进程并行运行?
解决MLKit TextRecognition多任务并行执行问题
问题原因
你当前的实现里,所有任务共享同一个TextRecognizer实例——MLKit的单个TextRecognizer内部会串行处理所有传入的process请求,哪怕你指定了多线程Executor,也只是用来执行单个任务的内部子操作,无法让多个识别任务并行运行。从日志能明显看到,四个任务的完成时间依次延迟,耗时累加,完全是串行执行的表现。
解决方案
为每个识别任务创建独立的TextRecognizer实例,每个实例可以独立处理请求,实现真正的并行。同时要注意在任务完成后关闭实例,避免内存泄漏。
修改后的代码示例
private Executor mExecutor = Executors.newFixedThreadPool(4); private void testTextRec() { new Thread(new RecRunnable("task 1")).start(); new Thread(new RecRunnable("task 2")).start(); new Thread(new RecRunnable("task 3")).start(); new Thread(new RecRunnable("task 4")).start(); } private class RecRunnable implements Runnable { private final String name; private RecRunnable(String name) { this.name = name; } @Override public void run() { // 每个任务创建独立的TextRecognizer实例 TextRecognizerOptions options = new TextRecognizerOptions.Builder() .setExecutor(mExecutor) .build(); TextRecognizer client = TextRecognition.getClient(options); Bitmap bitmap = readFromAsset("huchuan_passport.jpg"); InputImage inputImage = InputImage.fromBitmap(bitmap, 0); final long start = System.currentTimeMillis(); Log.e(TAG, "start " + name + " at :" + start); client.process(inputImage) .addOnSuccessListener(text -> { long elapse = System.currentTimeMillis() - start; Log.e(TAG, name + " elapses: " + elapse + "ms"); // 任务完成后关闭Recognizer释放资源 client.close(); }) .addOnFailureListener(e -> { // 失败场景也要关闭实例 client.close(); e.printStackTrace(); }); } private Bitmap readFromAsset(String fileName) { try { InputStream open = getAssets().open(fileName); return BitmapFactory.decodeStream(open); } catch (IOException e) { e.printStackTrace(); } return null; } }
额外说明
- 若任务量较大,建议用线程池统一管理任务,避免创建过多线程;也可以考虑复用
TextRecognizer实例,但要保证每个实例同一时间只处理一个任务。 - 你的设备有8个处理器,但MLKit文本识别属于CPU密集型操作,4个并行任务已经能充分利用CPU资源,无需过度增加并行数,避免资源竞争反而降低效率。
内容的提问来源于stack exchange,提问作者wu jushan
相关产品推荐
相关产品推荐

