Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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
Java RxAndroid:知道单个操作何时完成以及所有操作何时完成_Java_Android_Rx Java_Retrofit2_Rx Android - Fatal编程技术网

Java RxAndroid:知道单个操作何时完成以及所有操作何时完成

Java RxAndroid:知道单个操作何时完成以及所有操作何时完成,java,android,rx-java,retrofit2,rx-android,Java,Android,Rx Java,Retrofit2,Rx Android,我是RxJava新手,我已经通过改造实现了RxJava,以便使用flatMap同时下载多个文件。我正在成功接收个人下载的onComplete状态。但是,如果我收到所有下载的完成状态,我无法实现功能 以下是我用于多次下载的代码: private void downloadFile(String url, final File parentFolder) { final Uri uri = Uri.parse(url); Retrofit retrofit = new Retrofi

我是RxJava新手,我已经通过改造实现了RxJava,以便使用flatMap同时下载多个文件。我正在成功接收个人下载的onComplete状态。但是,如果我收到所有下载的完成状态,我无法实现功能

以下是我用于多次下载的代码:

private void downloadFile(String url, final File parentFolder) {
    final Uri uri = Uri.parse(url);
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url.replace(uri.getLastPathSegment(),""))
            .client(new OkHttpClient.Builder().build())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
    RestApi restApi = retrofit.create(RestApi.class);
    restApi.downloadFile(url)
            .flatMap(new Func1<Response<ResponseBody>, Observable<File>>() {
                @Override
                public Observable<File> call(final Response<ResponseBody> responseBodyResponse) {
                    return Observable.fromCallable(new Callable<File>() {
                        @Override
                        public File call() throws Exception {
                            File file = new File(parentFolder.getAbsoluteFile(), uri.getLastPathSegment());

                            if (!file.exists()) {
                                file.createNewFile();

                                BufferedSink sink = Okio.buffer(Okio.sink(file));
                                sink.writeAll(responseBodyResponse.body().source());
                                sink.close();
                            }
                            return file;
                        }
                    });
                }
            },3)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<File>() {

                @Override
                public void onCompleted() {
                    dManager.logMe(TAG,"file download complete");
                }

                @Override
                public void onError(Throwable e) {
                    dManager.logMe(TAG,"file download error");
                    e.printStackTrace();
                }

                @Override
                public void onNext(File file) {
                    dManager.logMe(TAG,"file download onNext: " + file.getAbsolutePath());
                }
            });
}
private void下载文件(字符串url,最终文件父文件夹){
最终Uri=Uri.parse(url);
改装改装=新改装.Builder()
.baseUrl(url.replace(uri.getLastPathSegment(),“”)
.client(新的OkHttpClient.Builder().build())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
RestApi RestApi=reformation.create(RestApi.class);
restApi.downloadFile(url)
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(最终响应-响应-响应){
返回Observable.fromCallable(newcallable()){
@凌驾
公共文件调用()引发异常{
File File=新文件(parentFolder.getAbsoluteFile(),uri.getLastPathSegment());
如果(!file.exists()){
createNewFile();
BufferedSink sink=Okio.buffer(Okio.sink(文件));
sink.writeAll(responseBodyResponse.body().source());
sink.close();
}
返回文件;
}
});
}
},3)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
未完成的公共无效(){
logMe(标记“文件下载完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
logMe(标记“文件下载错误”);
e、 printStackTrace();
}
@凌驾
公共void onNext(文件){
logMe(标记为“文件下载onNext:+file.getAbsolutePath());
}
});
}
我在许多for循环中调用downloadFile(stringurl,finalfileparentfolder),无论我在哪里收到url信息。
提前感谢。

假设您有一个
URL列表:

    Observable.from(urls)
            .flatMap(url -> restApi.downloadFile(url))
            .concatMap(new Func1<Response<ResponseBody>, Observable<File>>() {
                @Override
                public Observable<File> call(final Response<ResponseBody> responseBodyResponse) {
                    try {
                        File file = new File(parentFolder.getAbsoluteFile(), uri.getLastPathSegment());
                        if (!file.exists()) {
                            file.createNewFile();
                        }
                        BufferedSink sink = Okio.buffer(Okio.sink(file));
                        sink.writeAll(responseBodyResponse.body().source());
                        sink.close();
                        return Observable.just(file);
                    } catch (Exception e) {
                        return Observable.error(e);
                    }
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<File>() {

                @Override
                public void onCompleted() {
                    dManager.logMe(TAG, "file download complete");
                }

                @Override
                public void onError(Throwable e) {
                    dManager.logMe(TAG, "file download error");
                    e.printStackTrace();
                }

                @Override
                public void onNext(File file) {
                    dManager.logMe(TAG, "file download onNext: " + file.getAbsolutePath());
                }
            });
Observable.from(URL)
.flatMap(url->restApi.downloadFile(url))
.concatMap(新函数1(){
@凌驾
公共可观察呼叫(最终响应-响应-响应){
试一试{
File File=新文件(parentFolder.getAbsoluteFile(),uri.getLastPathSegment());
如果(!file.exists()){
createNewFile();
}
BufferedSink sink=Okio.buffer(Okio.sink(文件));
sink.writeAll(responseBodyResponse.body().source());
sink.close();
返回Observable.just(文件);
}捕获(例外e){
返回可观测误差(e);
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
未完成的公共无效(){
logMe(标记“文件下载完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
logMe(标记“文件下载错误”);
e、 printStackTrace();
}
@凌驾
公共void onNext(文件){
logMe(标记为“文件下载onNext:+file.getAbsolutePath());
}
});

下面是一个划痕示例

Observable.from(List <Url>)
                .flatMap(Observable.fromCallable(downloadImageHereAndReturnTheFile())
                        .observeOn(AndroidSchedulers.mainThread())
                        // Do on next is where you get notified when each url is getting downloaded
                        .doOnNext(doTheUIOperationHere())
                        .observeOn(Schedulers.io()) //Switch to background thread if you want, in case if you do some other background task otherwise remove the above this and the following next operator 
                        .doOnNext(DoSomeOtherOperationHere()))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<R>() {
                    @Override
                    public void onCompleted() {
                        Log.d(TAG, "The entire process of downloading all the image completed here");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(R r) {
                        Log.d(TAG, "You receive the file for each url");
                    }
                });
Observable.from(列表)
.flatMap(Observable.fromCallable(下载ImageHere和ReturntheFile())
.observeOn(AndroidSchedulers.mainThread())
//下一步是在下载每个url时收到通知的地方
.doOnNext(doTheUIOperationHere())
.observeOn(Schedulers.io())//如果需要,请切换到后台线程,以防执行其他后台任务,否则请删除上面的此操作符和下面的下一个操作符
.doOnNext(DoSomeOtherOperationHere())
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
Log.d(标记“下载此处完成的所有图像的整个过程”);
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
下一页(右)的公共空间{
d(标记“您收到每个url的文件”);
}
});

您可以传递列表并使用zip运算符组合结果。在这里我看到,您一次只下载一个文件。如果您有
List
,则使用
Observable.from()
迭代每个项目并进行下载,以便您可以清楚地了解
onComplete()
列表的
,您也可以获得每个
url的seprate
onComplete()
,而不是