weixin_41720011 2023-01-22 12:25 采纳率: 50%
浏览 65
已结题

安卓不同模块中执行顺序问题

请大伙帮忙解决一下问题,是这样的!在一个OCR模块MainPresenter中,如果识别出了图片的文字,会回调onNext方法

 @Override
                    public void onNext(RecognitionResultBean recognitionResultBean) {
                        LogUtils.d(TAG, "onnext="+recognitionResultBean.toString());
}


这个recognitionResultBean封装了识别出的文字信息。
然后在另一个模块AliPayAccessibilityService某一个方法中,我希望使用这些文字,但是问题在于,ocr个过程比较慢,我希望在这个方法中 m.myBinder.startCapture();之后获取到ocr文字后(封装为recognitionResultBean),在继续执行之后的代码,比如 LogUtils.d(TAG, "aaa");



但是现在的情况是模块AliPayAccessibilityService还没得到数据就往后执行了,请问大神怎么能保证获得OCR数据后在继续往后执行,运行结果如图1:


大家从调试输出结果就可以看到,aaa一开始就输出了(执行了)之后才回调到onNext方法,才输出了onnext=RecognitionResultBean里面得到的数据,我是希望获得RecognitionResultBean数据以后,才执行输出aaa功能代码,因为我之后要从RecognitionResultBean里面获取数据之后,在解析数据,关键调试信息,我都用红框标出了,其他部分可以忽略,如图2

img


图1

img

图2

  • 写回答

3条回答 默认 最新

  • 社区专家-Monster-XH 2023-01-22 12:36
    关注

    可以在AliPayAccessibilityService中使用CountDownLatch来实现等待ocr结果的功能。可以在m.myBinder.startCapture();之前初始化一个CountDownLatch,在onNext方法中调用countDown(),在AliPayAccessibilityService中使用await()方法等待ocr结果,在获得结果后再继续执行后面的代码。

    代码示例:

    CountDownLatch latch = new CountDownLatch(1);
    m.myBinder.startCapture();
    latch.await();
    LogUtils.d(TAG, "aaa");
    
    //onNext方法中
    @Override
    public void onNext(RecognitionResultBean recognitionResultBean) {
        LogUtils.d(TAG, "onnext="+recognitionResultBean.toString());
        latch.countDown();
    }
    
    
    

    这样就可以保证在获得ocr结果后再继续执行后面的代码。
    如果需要在多个地方使用ocr结果,可以考虑使用RxJava的Subject来实现。Subject是一种特殊的Observable,它允许多个Observer订阅它并接收通知。

    在MainPresenter中创建一个Subject,在onNext方法中调用onNext()方法发送ocr结果,在AliPayAccessibilityService和其他需要使用ocr结果的地方订阅这个Subject并在回调中获取ocr结果。

    代码示例:

    //MainPresenter中
    Subject<RecognitionResultBean> subject = PublishSubject.create();
    
    @Override
    public void onNext(RecognitionResultBean recognitionResultBean) {
        LogUtils.d(TAG, "onnext="+recognitionResultBean.toString());
        subject.onNext(recognitionResultBean);
    }
    
    //AliPayAccessibilityService中
    subject.subscribe(new Observer<RecognitionResultBean>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
    
        @Override
        public void onNext(RecognitionResultBean recognitionResultBean) {
            LogUtils.d(TAG, "aaa"+ recognitionResultBean);
        }
    
        @Override
        public void onError(Throwable e) {
        }
    
        @Override
        public void onComplete() {
        }
    });
    m.myBinder.startCapture();
    
    
    

    使用Subject可以方便的在多个地方获取ocr结果,并且可以解耦代码。
    希望能对您有所帮助!回答有用请你采纳,点击回答右侧采纳即可!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月30日
  • 已采纳回答 1月22日
  • 修改了问题 1月22日
  • 修改了问题 1月22日
  • 展开全部

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值