从可完成到可观察

时间:2018-10-01 13:44:26

标签: android asynchronous rx-java2

我会尽力澄清。

我想循环一个列表内的元素,对于MAIN_LIST中的每个元素,开始详细说明。详细说明包含另一个列表SECOND_LIST,该列表必须循环播放。完成对SECOND_LIST的每个项目的详细说明后,请开始对MAIN_LIST中的下一个元素进行相同的操作。

详细说明MAIN_LIST中的所有元素后,返回完成。

这是我尝试实现的目标,但是我认为有更好的方法。

感谢您的帮助!

循环MAIN_LIST的方法

    public Completable checkGroupExpiration(List<CheckVersion.ServiceStatus> serviceStatusList) {
    return Completable.create(emitter -> {
        Observable.fromIterable(serviceStatusList)
                .concatMapCompletable(serviceStatus -> {
                    return checkGroupExpiration(serviceStatus.service, serviceStatus.lastUpdate);
                }).subscribe(new CompletableObserver() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onComplete() {
                if (!emitter.isDisposed())
                    emitter.onComplete();
            }

            @Override
            public void onError(Throwable e) {
                if (!emitter.isDisposed())
                    emitter.onComplete();
            }
        });
    });
}

循环SECOND_LIST的方法

    protected Completable checkGroupExpiration(String group, long ttl) {
    return Completable.create(emitter -> {
        readFile(MASTER_NOTE)
                .map(s -> {
                    return new Gson().fromJson(s, MasterNote.class);
                }).flatMapObservable(masterNote -> {
            return Observable.fromIterable(masterNote.savedFiles.entrySet());
        }).filter(stringCacheInfoEntry -> {
            return stringCacheInfoEntry.getValue().group.equals(group) && stringCacheInfoEntry.getValue().ttl < ttl;
        }).concatMapCompletable(stringCacheInfoEntry -> {
            return getFile(stringCacheInfoEntry.getKey(), false)
                    .doOnSuccess(file -> {
                        String fileName = file.getName();
                        file.delete();
                        Log.d(TAG, "File deleted => " + fileName + " from group => " + group);
                    }).ignoreElement();
        }).subscribe(new CompletableObserver() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onComplete() {
                if (!emitter.isDisposed())
                    emitter.onComplete();
            }

            @Override
            public void onError(Throwable e) {
                if (!emitter.isDisposed())
                    emitter.onComplete();
            }
        });
    });
}

1 个答案:

答案 0 :(得分:0)

是的,有。不要订阅create内部的内部流,而是直接使用这些流:

public Completable checkGroupExpiration(
        List<CheckVersion.ServiceStatus> serviceStatusList) {
    retrn Observable.fromIterable(serviceStatusList)
            .concatMapCompletable(serviceStatus -> 
                checkGroupExpiration(serviceStatus.service, serviceStatus.lastUpdate)
            )
            .ignoreElements();
}

protected Completable checkGroupExpiration(String group, long ttl) {
    return 
         readFile(MASTER_NOTE)
         .map(s ->
                new Gson().fromJson(s, MasterNote.class)
         )
         .flatMapObservable(masterNote ->
              Observable.fromIterable(masterNote.savedFiles.entrySet())
         )
         .filter(stringCacheInfoEntry ->
              stringCacheInfoEntry.getValue().group.equals(group) 
              && stringCacheInfoEntry.getValue().ttl < ttl
         )
         .concatMapCompletable(stringCacheInfoEntry -> 
              getFile(stringCacheInfoEntry.getKey(), false)
              .doOnSuccess(file -> {
                    String fileName = file.getName();
                    file.delete();
                    Log.d(TAG, "File deleted => " + fileName + " from group => " + group);
              })
              .ignoreElement()
        );
}