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 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?