От дополняемого до наблюдаемого - PullRequest
0 голосов
/ 01 октября 2018

Я попытаюсь быть более ясным, насколько смогу.

Я хочу зациклить элементы в списке, для каждого элемента в 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 голосов
/ 01 октября 2018

Да, есть.Не подписывайтесь на внутренний поток внутри 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()
        );
}
...