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

请大伙帮忙解决一下问题,是这样的!在一个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

可以在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结果,并且可以解耦代码。
希望能对您有所帮助!回答有用请你采纳,点击回答右侧采纳即可!

看你的代码和截图的结果来看,startCapture方法是个服务或者线程,还没执行完得到结果,就会继续执行下一句代码,所以就出现了你说的这个现象,你可以在onNext接口回调后,在里面发送一个handler到主线程(activity)中继续执行你需要的代码即可。

在这种情况下,你需要使用一种机制来确保OCR过程完成后再继续执行代码。有几种方法可以做到这一点:

1.使用回调函数:在调用m.myBinder.startCapture();之后,可以将一个回调函数传给startCapture()方法。当OCR过程完成后,将会调用该回调函数,在回调函数中执行后续操作。

2.使用Promise/Future:在调用m.myBinder.startCapture();之后,可以返回一个Promise/Future对象。当OCR过程完成后,该对象将会被完成,并可以使用.then()方法来注册回调函数。在回调函数中可以获取到OCR结果并执行后续操作。
3.使用RxJava:在调用m.myBinder.startCapture();之后,可以使用RxJava的Observable对象来封装OCR过程。在订阅该Observable之后,可以使用.subscribe()方法来注册回调函数。在回调函数中可以获取到OCR结果并执行后续操作