Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将AsyncTask转换为RxJava(Android)_Java_Android_Rx Java - Fatal编程技术网

将AsyncTask转换为RxJava(Android)

将AsyncTask转换为RxJava(Android),java,android,rx-java,Java,Android,Rx Java,我有一些代码: class WorkEngineTask extends AsyncTask<Void, RecognitionResult, Void> { @Override protected Void doInBackground(Void... unused) { while (true) { try { frameReady.acquire(

我有一些代码:

  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];
        }
    }
class WorkEngineTask扩展异步任务{
@凌驾
受保护的空位背景(空位…未使用){
while(true){
试一试{
frameReady.acquire();//正在等待帧
如果(!处理){
打破
}
Camera.Size Size=Camera.getParameters().getPreviewSize();
识别结果;
开关(槽){
案例0:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.scape);
打破
案例180:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.inversedlandscape);
打破
案例270:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.InvertedPortrait);
打破
违约:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.crative);
}
publishProgress(结果);//显示当前结果
}捕获(例外e){
}
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(识别结果…res){
识别结果=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();
                    }
                });
    }
public void workEngine(){
可观察。创建((可观察订阅)发射器->{
while(true){
试一试{
frameReady.acquire();//正在等待帧
如果(!处理){
打破
}
Camera.Size Size=Camera.getParameters().getPreviewSize();
识别结果;
开关(槽){
案例0:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.scape);
打破
案例180:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.inversedlandscape);
打破
案例270:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.InvertedPortrait);
打破
违约:
结果=session.ProcessYUVSnapshot(mData、size.width、size.height、ImageOrientation.crative);
}
emitter.onNext(结果);
}捕获(例外e){
String message=“处理帧时出错:”+e.toString();
Log.d(“smartid”,消息);
回调错误(消息);
}
}
}).observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
认购的公共无效(一次性d){
}
@凌驾
public void onNext(识别结果识别结果){
draw.showResult(识别结果);
draw.invalidate();
回调。已识别(识别结果);
frameWaiting.release();
}
@凌驾
未完成的公共空间(){
}
@凌驾
公共无效申报人(可丢弃的e){
e、 printStackTrace();
}
});
}

但这对我不起作用。我是Android新手,从来没有使用过异步任务,现在也不想使用它。我试了很多次,但都无济于事。我不明白我做错了什么。请帮助我解决此问题。

无论您在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();
                        }