不使用静态/全局变量,如何将数据传递给onSuccess()回调方法?
问题解答
结论
需求完全可以实现,不需要借助静态变量或全局变量。
实现原理
Java 匿名内部类天然支持访问所在方法的局部变量,仅需要满足变量是final 修饰或者*实际不可变(赋值后没有二次修改)*的规则即可,你提供的示例代码本身已经用到了这个特性,仅需要调整两处小问题即可正常运行。
现有代码的问题修正
- 变量定义语法问题:
String test = "Test"末尾缺少分号,补全即可。 - 异步逻辑错误:
recognizer.close()不能直接写在启动识别任务的代码后面,文字识别是异步任务,recognizer.process()会立即返回,此时直接关闭识别器会导致还在运行的识别任务因资源被提前释放而失败,需要把关闭逻辑移动到成功、失败两个回调的末尾执行。
修正后示例代码
private void recognizeTextFromImage(InputImage image) { // 低版本Java可以手动加final修饰:final String test = "Test"; String test = "Test"; TextRecognizer recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS); Task<Text> task = recognizer.process(image); task .addOnSuccessListener( new OnSuccessListener<Text>() { @Override public void onSuccess(Text texts) { recognizedText = processTextRecognitionResult(texts); editText_Test.setText(test + recognizedText); Log.d(TAG,"Successful: " + recognizedText); // 任务成功后释放资源 recognizer.close(); } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e(TAG, "识别失败: " + e.getMessage()); // 任务失败后也要释放资源 recognizer.close(); } }); }
补充说明
如果你的项目使用 Java 8 及以上版本,只要test变量赋值后没有二次修改,不需要手动加final修饰,编译器会自动判定它为「有效 final」变量,可以直接在匿名内部类中访问。
内容的提问来源于stack exchange,提问作者Micky
相关产品推荐
相关产品推荐

