RX Java 2 onComplete方法为每个可观察对象调用

RX Java 2 onComplete方法为每个可观察对象调用,java,android,rx-java,reactive-programming,rx-java2,Java,Android,Rx Java,Reactive Programming,Rx Java2,我是新手。我需要在异步模式下执行一些工作,并在所有工作完成后得到一个回调。我已经在回调方法中放入了一些Log.d,我看到onComplete(以及onNext)方法对于每个完成的作业都会执行,但这不是我设计的行为。 另外,如果调用dispose方法,我将无法重新提交新作业,因为线程没有启动,我必须将包含RX Java方法的类的引用设置为null,并创建一个新实例 注意,请避免使用lambda表达式 这是我的密码: public class Async2 { priva

我是新手。我需要在异步模式下执行一些工作,并在所有工作完成后得到一个回调。我已经在回调方法中放入了一些Log.d,我看到onComplete(以及onNext)方法对于每个完成的作业都会执行,但这不是我设计的行为。 另外,如果调用dispose方法,我将无法重新提交新作业,因为线程没有启动,我必须将包含RX Java方法的类的引用设置为null,并创建一个新实例

注意,请避免使用lambda表达式

这是我的密码:

 public class Async2 {
    
        private final CompositeDisposable disposables = new CompositeDisposable();
        private ArrayList<FileRepresentation> fileRepresentationList = null;
    
    
        public Async2() {
            fileRepresentationList = new ArrayList<>();
    
        }
    
        public ArrayList<FileRepresentation> getFileRepresentationList() {
            return fileRepresentationList;
        }
    
        public void dispose(){
            disposables.dispose();
    
        }
    
    
        public Observable<FileRepresentation> calcObservable(Uri uri, Context context) {
            return Observable.defer(new Callable<ObservableSource<? extends FileRepresentation>>() {
                @Override
                public ObservableSource<? extends FileRepresentation> call() {
    
                    FileUtils fu = new FileUtils();
    
                    FileRepresentation fileRepresentation = FileUtils.calcolaChecksumFromUri(uri, context); //this is the long running job
    
                    Log.d("test-0X", fileRepresentation.nome);
                    Log.d("test-0X", fileRepresentation.hash);
                    Log.d("Thread name: ", Thread.currentThread().getName());
    
    
                    FileRepresentation finalFileRepresentation = fileRepresentation;
                    //return Observable.defer(() -> Observable.just(finalFileRepresentation));
                    return Observable.just(finalFileRepresentation);
                }
            });
        }
    
    
    
        //
    
    
        public void addWorks(List<Uri> uriList, Context context, CommunicationInterface com){
    
            fileRepresentationList.clear();
    
            int nObservable = uriList.size();
            AtomicInteger remainings = new AtomicInteger(nObservable);
    
            disposables.clear();
            com.enableProgressBar();
    
            Disposable[] disposableArr = new Disposable[nObservable];
            Log.d("addworks", "addWorks method (nObservable var): "+nObservable);
            Log.d("addworks", "addWorks method (disposable.size() ): "+disposables.size());
            for (int i= 0; i<nObservable; i++){
                Disposable disposable = calcObservable(uriList.get(i), context)
                        // Run on a background thread
                        .subscribeOn(Schedulers.single())
                        // Be notified on the main thread
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeWith(new DisposableObserver<FileRepresentation>() {
                            @Override
                            public void onComplete() {
                                if(remainings.decrementAndGet() == 0){
                                    Log.d("Method onComplete called", "elementi lista: "+fileRepresentationList.size());
                                    Log.d("Method onComplete called", "End!!");
                                    com.disableProgressBar();
                                    com.notifyCompletion();
                                }
                                com.updateProgress();
Log.d("Method onComplete called", "End!!");
    
                            }
    
                            @Override
                            public void onError(Throwable e) {
                                if(remainings.decrementAndGet() == 0){
                                    Log.d("Method onError", "elementi lista: "+fileRepresentationList.size());
                                    Log.d("Method onError", "End!!");
                                    com.disableProgressBar();
                                    com.notifyCompletion();
                                }
    
                                com.updateProgress();
    
                                Log.d("method onError", "method onError called");
    
                            }
    
                            @Override
                            public void onNext(FileRepresentation value) {
    
                                fileRepresentationList.add(value);
                            }
                        });
    
                disposableArr[i] = disposable;
    
            }
            disposables.addAll(disposableArr);
            Log.d("addworks", "addWorks method (disposable.size() ): "+disposables.size());
    
        }
    
    }
公共类异步2{
私有最终复合可处置资产=新复合可处置资产();
private ArrayList fileRepresentationList=null;
公共异步2(){
fileRepresentationList=新的ArrayList();
}
公共ArrayList getFileRepresentationList(){
返回fileRepresentationList;
}
公共空间处置(){
可处置的;可处置的;
}
公共可观察calcObservable(Uri,上下文){

return Observable.defer(new Callable您不必创建N个Observable和Observable,只需从列表中创建一个流:

disposables.add(
可观察的。从可观察的(uriList)
.subscribeOn(Schedulers.single())
.flatMap(新函数(){
@凌驾
公共可观察应用(Uri){
返回calcObservable(uri,上下文);
}
},/*delayErrors*/true)
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(新可处置观察员){
@凌驾
未完成的公共空间(){
Log.d(“调用了onComplete方法”,“elementi lista:+fileRepresentationList.size());
d(“方法onComplete调用”,“End!!”;
com.disableProgressBar();
com.notifyCompletion();
d(“方法onComplete调用”,“End!!”;
}
@凌驾
公共无效申报人(可丢弃的e){
Log.d(“Method onError”,“elementi lista:+fileRepresentationList.size());
Log.d(“方法一错误”,“结束!!”);
com.disableProgressBar();
com.notifyCompletion();
Log.d(“方法onError”,“调用方法onError”);
}
@凌驾
public void onNext(文件表示值){
fileRepresentationList.add(值);
com.updateProgress();
}
})
);

您何时以及为什么调用
dispose()
?调用它意味着将立即处理所有未来的工作。如果我想取消作业,我会从主活动调用Hanks以获取答案。我尝试了您的代码,但它不起作用。“apply”方法返回“FileRepresentation”,但在正文的最后,调用“calcObservable”)返回一个“可观察”对象。我尝试在“apply”方法中创建一个“FileRepresentation”对象并返回(只是为了查看问题是否是不兼容的返回类型),但它没有正常工作,它必须是
函数
。再次感谢您,但尚未解决…相同的问题:您是否更改
calcObservable
以返回
FileRepresentation
?将其更改回
Observable
。不,我没有更改calcObservable。在尝试返回新对象FileRepresentation c之前在“apply”函数中创建以进行测试。当您回答时,我已经在我的方法中复制/粘贴了您的代码,但Android Studio一直在抱怨返回类型,如上图所示:(
 ArrayList<FileRepresentation> li = async2.getFileRepresentationList();