【问题标题】:Read Files using Rx Java使用 Rx Java 读取文件
【发布时间】:2018-08-25 05:41:15
【问题描述】:

我从一个文件夹中有许多文件,我正在读取这些文件并将其内容存储到数据库中。随后如何使用 RX Java 执行相同的操作?因为我有很多文件要阅读,并且在异步任务中花费了很多时间

String path = "some path";
        File directory = new File(path);
        File[] files = directory.listFiles();
        Log.d(TAG, "Size: " + files.length);
        for (int i = 0; i < files.length; i++) {
            Log.d(TAG, "FileName -> " + files[i].getName());

         //execute async to read file
        }

【问题讨论】:

  • RxJava 不会比 AsyncTask 更快。相同的线程内容将在低级别触发。请出示您的 AsyncTask 代码。
  • 请把你的异步任务也放上来。
  • 请发布您的代码。
  • 您可以将同步调用替换为异步调用。正如已经说过的,它不会更快。在读取文件时,您根本不会阻塞 UI 线程。不过,您可以在此处找到并行处理的示例:github.com/ReactiveX/RxJava#parallel-processing。您可以将文件列表划分为“包”,其中文件数等于手机的 CPU 内核数。如果手机有例如2核,可以同时处理2个文件,等到处理结束,取下2个文件,以此类推。这不是微不足道的,但应该是可能的。

标签: android rx-java readfile


【解决方案1】:

你可以在 RxJava 中用多线程替换你的单线程方法非常容易(相比之下,不使用 RxJava)。 AsyncTask 使用executeOnExecutor(Executor exec, Params... params) 提供并行执行,因此您当前的实现可以调整为AsyncTask 以处理单个文件而不是完整的目录。但是你的问题是关于 RxJava。

多线程将加快文件读取速度 - 速度提升将取决于很多因素,但主要是您的闪存顺序读取/随机读取速度。看到这将是一个冷Observable 他们真的没有意义使用Flowable 因为背压不会在这里发挥作用。

用于实现某种多线程的伪代码:

    Observable.just(directory)
            .flatMap(dir ->
                    Observable.fromArray(dir.listFiles()))
            .filter(File::isFile)
            .flatMap(file ->
                    Observable.just(file)
                            .map(this::readFileFunctionWithReturn)
                            .subscribeOn(Schedulers.io())) // execute on multiple threads
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()) // observe on UI, or choose another Scheduler
            .subscribe(fileResult -> {
                // unordered results
            });

如果您想对线程进行更细粒度的控制,例如自定义ThreadFactory,您还可以创建由Executor 支持的自定义Scheduler 实现。

【讨论】:

  • 您的代码很有帮助。只有一个混淆,在调用 readFileFunctionWithReturn 函数之前,我需要检查文件是否是目录,如果是目录则再次调用第一个平面图,或者使用 readFileFunctionWithReturn 移动 函数。我该怎么做..??
  • 您提供的代码不执行此操作?您不能只在 cmets 中添加期望 - 显示执行此操作的现有代码。为了递归地挑选出文件和目录,您需要concatMap / concatWith
  • 做到了..!!制作了另一个递归可观察对象,目前正在使用。非常感谢,你的回答很有帮助..!!
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 2011-04-30
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多