RxJava发生错误时执行操作

时间:2017-05-03 08:55:35

标签: error-handling rx-java rx-android

我需要创建一个不存在的文件夹。在我的情况下,唯一的方法是捕获错误并处理它以创建所需的文件夹。 但我能找到的只是

public static Observable<Boolean> folderExists(final Context context, final String targetPath, final String currentpath) {
    Application application = Application.get(context);
//i browse the folder to get all the items
        return browseFolderObservable(context,currentpath)
                .subscribeOn(application.defaultSubscribeScheduler())
                .doOnError(new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        BsSdkLog.d("Error no file found");
                    }
            })

            .map(new Func1<ArrayList<Item>, Boolean>() {
                @Override
                public Boolean call(ArrayList<Item> items) {

                    if(items.isEmpty()) {

                        BsSdkLog.d(" No items");
                        return false;
                    }else  {
                        for(int i=0;i<items.size();i++)
                        {
                            Item item=items.get(i);
                            BsSdkLog.d(item.toString());
                        }
                        BsSdkLog.d("Right-here");
                        return true;

                    }
                }
            });


}

我想调用我有的方法,在发生错误时创建文件夹,但我不知道该怎么做。 我是新手,所以我非常感谢你的帮助 感谢

1 个答案:

答案 0 :(得分:0)

基本原则看起来像这样。我使用Java NIO库进行测试。

方法'createFolder'只是包装创建一个文件夹。测试'name'调用Single并检查Exception。如果是IOException,它将返回一个回退值。你可以在那里做些不同的事情。你只需提供一个后备单曲。如果它是一个与IOException不同的错误,它将返回错误。

@Test
void name() throws Exception {
    final String TO_CREATE = "/home/sergej/Downloads/Wurstbrot";
    this.createFolder(TO_CREATE)
            .onErrorResumeNext(throwable -> { // handle Exception:
                // Validate Exception
                if (throwable instanceof IOException) {
                    // Return fallback
                    return Single.just(Paths.get("/home/sergej/Downloads/"));
                }

                return Single.error(throwable);

            })
            .test()
            .await()
            .assertValueCount(1)
            .assertValue(path -> path.endsWith(TO_CREATE))
            .assertNoErrors();

}

private Single<Path> createFolder(String p) {
    return Single.defer(() -> { // may throw some IOException

        Path path = Paths.get(p);

        if (!Files.exists(path)) {
            Path createdDirectory = Files.createDirectory(path); // will throw if already exists

            return Single.just(createdDirectory);
        }

        // Or just return Path, because it already exists???
        return Single.error(new IOException("Already exists"));
    });
}