Конвертировать AsyncTask в RxJava (Android) - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть код:

  class WorkEngineTask extends AsyncTask<Void, RecognitionResult, Void> {
        @Override
        protected Void doInBackground(Void... unused) {
            while (true) {
                try {
                    frameReady.acquire();  // waiting for the frame

                    if (!processing) {
                        break;
                    }
                    Camera.Size size = camera.getParameters().getPreviewSize();
                    RecognitionResult result;
                    switch (mAngle) {
                        case 0:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.Landscape);
                            break;
                        case 180:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.InvertedLandscape);
                            break;
                        case 270:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.InvertedPortrait);
                            break;
                        default:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.Portrait);
                    }
                    publishProgress(result);  // show current result
                } catch (Exception e) {

                }
            }
            return null;
        }
        @Override
        protected void onProgressUpdate(RecognitionResult... res) {
            RecognitionResult result = res[0];
        }
    }

Мне нужно преобразовать его в код rxJava.
Я пытаюсь написать код.Вот мой код:

 public void workEngine() {
        Observable.create((ObservableOnSubscribe<RecognitionResult>) emitter -> {
            while (true) {
                try {
                    frameReady.acquire();  // waiting for the frame

                    if (!processing) {
                        break;
                    }

                    Camera.Size size = camera.getParameters().getPreviewSize();
                    RecognitionResult result;

                    switch (mAngle) {
                        case 0:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.Landscape);
                            break;
                        case 180:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.InvertedLandscape);
                            break;
                        case 270:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.InvertedPortrait);
                            break;
                        default:
                            result = session.ProcessYUVSnapshot(mData, size.width, size.height, ImageOrientation.Portrait);
                    }
                    emitter.onNext(result);
                } catch (Exception e) {
                    String message = "Error while processing frame: " + e.toString();
                    Log.d("smartid", message);
                    callback.error(message);
                }
            }

        }).observeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<RecognitionResult>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(RecognitionResult recognitionResult) {
                        draw.showResult(recognitionResult);
                        draw.invalidate();
                        callback.recognized(recognitionResult);
                        frameWaiting.release();
                    }

                    @Override
                    public void onComplete() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                    }
                });
    }

Но он не работает для меня.Я новичок в Android и никогда не использую асинхронную задачу, и я не хочу использовать ее сейчас.Я пробую много раз, но ничего не помогу.Я не могу понять, что я делаю неправильно.Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Что бы вы ни делали для обработки результата в AsyncTask, вы должны сделать это в onNext ();то есть когда получен ожидаемый результат.Тогда onComplete () будет вызван, когда нечего выдавать.Так что надо делать уборку, например, релиз.Если в случае ошибки есть что-то вроде журнала, который вы хотите, вы делаете это в onError ().

 @Override
                        public void onNext(RecognitionResult recognitionResult) {
                            //This doesn't match what you did in the AsyncTask above
                            draw.showResult(recognitionResult);
                            draw.invalidate();
                            callback.recognized(recognitionResult);

                        }

                        @Override
                        public void onComplete() {
                             frameWaiting.release();
                        }
0 голосов
/ 29 сентября 2019

Эта статья хорошо объясняет, как это сделать
https://android.jlelse.eu/how-to-convert-an-asynctask-to-rxjava-80e5d777a40

...