使用 OkHttp、Okio 和 RxJava 下载文件

2024-03-01

我正在尝试使用 OkHttp 下载文件并使用 Okio 写入磁盘。我还为此过程创建了一个 rx observable。它正在工作,但是它比我以前使用的(Koush 的 Ion 库)明显慢。

以下是我创建可观察对象的方法:

public Observable<FilesWrapper> download(List<Thing> things) {
    return Observable.from(things)
        .map(thing -> {
            File file = new File(getExternalCacheDir() + File.separator + thing.getName());

            if (!file.exists()) {
                Request request = new Request.Builder().url(thing.getUrl()).build();
                Response response;
                try {
                    response = client.newCall(request).execute();
                    if (!response.isSuccessful()) new IOException();
                    else {
                        BufferedSink sink = Okio.buffer(Okio.sink(file));
                        sink.writeAll(response.body().source());
                        sink.close();
                    }
                } catch (IOException e) {
                    new IOException();
                }
            }

            return file;
        })
        .toList()
        .map(files -> new FilesWrapper(files);
}

有谁知道什么可能导致速度慢,或者我是否错误地使用了运算符?


使用 flatMap 而不是 map 将允许您并行执行下载:

public Observable<FilesWrapper> download(List<Thing> things) {
    return Observable.from(things)
            .flatMap(thing -> {
                File file = new File(getExternalCacheDir() + File.separator + thing.getName());
                if (file.exists()) {
                    return Observable.just(file);
                }

                final Observable<File> fileObservable = Observable.create(sub -> {
                    if (sub.isUnsubscribed()) {
                        return;
                    }

                    Request request = new Request.Builder().url(thing.getUrl()).build();

                    Response response;
                    try {
                        response = client.newCall(request).execute();
                        if (!response.isSuccessful()) { throw new IOException(); }
                    } catch (IOException io) {
                        throw OnErrorThrowable.from(OnErrorThrowable.addValueAsLastCause(io, thing));
                    }

                    if (!sub.isUnsubscribed()) {
                        try (BufferedSink sink = Okio.buffer(Okio.sink(file))) {
                            sink.writeAll(response.body().source());
                        } catch (IOException io) {
                            throw OnErrorThrowable.from(OnErrorThrowable.addValueAsLastCause(io, thing));
                        }
                        sub.onNext(file);
                        sub.onCompleted();
                    }

                });
                return fileObservable.subscribeOn(Schedulers.io());
            }, 5)
            .toList()
            .map(files -> new FilesWrapper(files));
}

我们使用 flatMap 上的 maxConcurrent 限制每个订阅者同时请求的数量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OkHttp、Okio 和 RxJava 下载文件 的相关文章

  • 使用匕首柄作为依赖注入来处理多个改造客户端?

    我想在我的 android 应用程序中使用两个不同的后端 具有不同的响应格式 我使用 hilt 作为依赖注入 并对网络调用进行改造 这非常适合工作 因为我已经添加了第二个服务器网络文件和应用程序模块 所以它给了我错误 该错误列在最后 我需要
  • Phonegap(应用程序错误...发生网络错误)

    我已经使用phonegap 创建了一个版本 在index html 文件中 我编写了一个简单的iframe 用于加载网站 当我从phonegap获取本地url时它就起作用了 但如果我将整个构建作为 zip 文件上传到 PhoneGap 中
  • 在 Android 中使用 awt

    我有一个绘制图表的 Java Swing 应用程序 它使用 Graphics2D 调用和 awt 对象 例如 Rectangle 等 在某些时候我可能想将其移植到 Android 上 我知道我无法在 Android 上使用 Graphics
  • 清晰的图标 清晰的 Android 应用程序

    你好 下午好 关于如何提高图标的 png 质量 有什么想法吗 我使用了 Android 开发者页面上的套件 但我无法获得清晰的图像 我的意思是非常清晰 我是否需要以不同的方式加载此图标 而不仅仅是拖入我的布局 谢谢 我使用这个布局
  • 在 Android 市场中以编程方式检查我的应用程序版本

    目前 我正在启动时检查应用程序版本代码 并将其与我的服务器上的最新版本代码进行匹配 并根据此匹配 我发送用户从 Android 市场获取最新更新 它运行良好 但我的问题是我必须手动更改服务器上的最新版本代码 并且我不知道新版本何时发布APK
  • 不使用eclipse安装Android模拟器

    如何在没有eclipse的电脑上安装android模拟器 android模拟器无需安装eclipse 只需下载 android sdk 并安装即可 安装android SDK之前必须先安装JDK 完成后安装成功 您将获得两个应用程序 SDK
  • Android,如何从 XML 布局添加 Google 地图选项?

    我有一个包含 MapView 的片段 我已将此视图添加到 XML 文件中 如下所示
  • Android 中图像字节表示的每像素字节数

    我目前正在编写一个Android应用程序 需要在其中使用OCR 为了实现这一点 我将 Tesseract 与tesseract android tools 项目 http code google com p tesseract androi
  • 突出显示列表视图项目

    我需要在触摸列表视图项目时突出显示它并保持突出显示状态 我尝试了我发现的一切 但没有任何效果 这是我的代码 这是列表视图
  • 无法接收UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED的广播Intent

    我最近正在编写一个 USB 主机应用程序 但它被卡住了 因为我无法检测到设备连接 分离事件 我遵循了编码说明http developer android com guide topics connectivity usb host html
  • 在活动启动期间优雅地处理屏幕方向变化

    我正在尝试找到一种方法来正确处理设置活动 其中活动的方向是根据启动它的意图中的数据确定的 这是一款用户可以选择关卡的游戏 其中一些是纵向的 一些是横向的 我面临的问题是setRequestedOrientation ActivityInfo
  • 检测设备方向

    我需要检测 Android 设备方向变化 而无需手动处理传感器数据 同时保持活动方向坚持某个方向 onConfigurationChange不会起作用 因为会让我的活动不旋转 通过使用传感器数据来检测方向变化 我认为这是轮子的发明 因为 A
  • 何时调用 glMatrixMode()

    我所关注的大多数 Android OpenGL ES 教程都有其 onSurfaceChanged 函数 如下所示 public void onSurfaceChanged GL10 gl int width int height gl g
  • 使用 twitter API 1.1 在 Android 应用程序中显示 twitter feed

    基本上我想展示这个提要 https en twitter com epl live https en twitter com epl live在我的应用程序中 由于 twitter 更改了其 api 1 1 每个调用都必须经过授权 我发现的
  • onStart() 到底做了什么? - 安卓[重复]

    这个问题在这里已经有答案了 一段时间以来 我一直想知道 onStart 函数在 android 生命周期中的确切作用 网上的大多数资源只是说 它在您的活动在屏幕上可见之前被调用 但到目前为止我所做的应用程序我从未使用过onStart 我在
  • 活动中列表视图中的粘滞行

    我的列表视图中只有一行应该是粘性的 而不是粘性标题中带有字母的部分或部分 我真的很感激任何关于列表视图在活动中粘性一行而不是片段的帮助 我该怎么做 我真的很感谢任何帮助 提前致谢 使用如下代码 class MyAsyncTask exten
  • Android:选择 EditField 上焦点上的所有文本

    我试图让 Android 在获得焦点时选择 EditText 字段中的所有文本 我在布局中使用此属性 在两个字段上 android selectAllOnFocus true 我不确定这是否相关 但为了将光标移动到第一个可编辑字段 前面 还
  • 如何以编程方式检测android中可用的底部软导航栏?

    我试图通过 android 程序确定软导航栏 我没有找到直接的方法来确定 有没有办法找到导航栏的可用性 软导航栏图像在这里 以下方法对我有用并在许多设备上进行了测试 public boolean hasNavBar Resources re
  • Android:我的应用程序太大并给出“无法执行 dex:方法 ID 不在 [0, 0xffff]: 65536”?

    我正在尝试将我的应用程序与 Box Dropbox 和 Google Drive 集成 所有这 3 项服务都需要许多第 3 方 jar 此外 我的应用程序已经需要一些第三方 jar 现在 当我尝试从 Eclipse 运行我的应用程序时 出现
  • FCM 主题是否适合更多用户?

    我对使用主题消息有点困惑 我的场景是根据通知触发一些作业 请帮助我更多地了解这一点 如果我们正在处理大量用户 则可以使用 FCM 主题向用户发送通知 我们可以只使用数据消息和主题消息吗 使用主题发送的消息是否保证送达 我在 FCM 文档中看

随机推荐

  • PHP 扩展 (memcache|memcached) 未显示在 phpinfo() 中,但显示在 php -m 和 php -i 中?

    当我使用时 我将两个模块列为已安装 配置 php m 或者如果我使用 php i 但是当我使用时 m new Memcache or m new Memcache or m new Memcached or m new Memcached
  • 如何随着标签宽度的增加对齐所有字段

    我有一个表单 其中标签位于左侧 字段位于右侧 当标签包含少量文本时 此布局非常有效 我可以轻松设置min width标签上 以确保它们与田地的距离相同 在下面的第一张图片中 这按预期工作 当标签的文本变得太长时就会出现问题 它要么溢出到下一
  • XQuery 获取属性列表

    如果我有几个SectionXML 文档中的元素 我使用什么 XQuery 来获取所有元素的列表name values section 在 XPath 2 0 XQuery 的子集 中 可以使用以下表达式来获取 Section 元素的 nam
  • Django 1.6 和 Celery 3.0 内存泄漏

    将 Django 升级到 1 6 后 我的 celery Worker 正在耗尽 RAM 似乎分配给工作人员的内存没有被释放 并且在每次任务后都会增加 相关设置 DB DATABASES default ENGINE django db b
  • python + googledrive:上传xlsx,转换为googlesheet,获取可共享链接

    我想要的程序的流程是 上传 xlsx 电子表格到驱动器 它是使用 pandas 创建的to excel 将其转换为 Google 表格格式 指定任何知道该链接的人都可以对其进行编辑 获取链接并与将输入信息的人共享 下载完成的表格 我目前正在
  • JavaScript 保留关键字

    我想知道 JavaScript 的保留关键字 函数是如何管理的 Example 根据 http www quackit com javascript javascript reserved words cfm http www quacki
  • JSF2/PrimeFaces 中的命名容器 [重复]

    这个问题在这里已经有答案了 PrimeFaces 中可能的命名容器有哪些 当我们想要使用以下命令更新表单上的某些 UI 控件时 为什么需要为 Ajax 更新调用附加命名容器 idupdate mainForm MainAccordian u
  • Visual Studio Code 中的语言可以扩展吗?

    Scenario 我有 JSON 文件 描述了一系列要执行的任务 其中每个任务都可以引用 JSON 文件中的其他任务和对象 tasks id first action doSomething result id second action
  • 如何使用python解压文件

    我怎样才能提取一个 zip or rar使用 Python 文件 迟到了 但我对任何答案都不满意 pip install patool import patoolib patoolib extract archive foo bar rar
  • 我可以使用 URL 打开 Windows 8 应用程序吗?

    我正在创建一个具有共享会话功能的应用程序 例如 私人应用程序到应用程序的聊天会话 我会启动应用程序并创建一个 聊天室 然后通过电子邮件与某人 共享 我想要做的是创建一个 URL 当单击它时 它会打开您计算机上的应用程序 如果我邀请您到我的
  • 在 C# Windows 窗体应用程序中捕获 Ctrl + Shift + P 击键 [重复]

    这个问题在这里已经有答案了 可能的重复 在 Windows 窗体应用程序中捕获组合键事件 https stackoverflow com questions 3062587 I need to perform a particular op
  • Java使用索引来一一显示数组

    我在按索引显示数组时遇到问题 我不知道为什么会发生这种情况 任何帮助将不胜感激 这是我的代码片段 create token2 String token2 create Scanner inFile2 Scanner inFile2 new
  • Swift 3 - 调整字体大小以适合宽度、多行

    我有一个 UILabel 它设置为 42 0 pt 字体 并且标签的宽度是使用基于标签本身以外的因素的自动约束设置的 也就是标签右侧和左侧的内容决定标签的宽度 我想自动调整字体大小以适应标签的宽度 但也可以的话分成两行 与此类似 我知道您可
  • 如何将表达式插入到R中的函数体中

    我有一个函数f lt function x x 我想插入该行x lt 2 x into f这样它最终会变成 function x x lt 2 x x 我明白我应该使用body 但到目前为止我只知道如何替换entire身体 这对于我的真正目
  • 如何修复输入和参数张量不在同一设备上?

    我看到其他人也遇到此错误 我尝试按照步骤解决 但仍然收到此错误 运行时错误 输入和参数张量不在同一设备上 在 cpu 处找到输入张量 在 cuda 0 处找到参数张量 我运行 model to device 和 input seq to d
  • PDFKit - 使用 pageViewController 的 PDFView - 滑动到下一页时页面渲染缓慢

    我有一个设置为使用 pageViewController 的 PDFView let pdfView PDFView let pdfDoc PDFDocument url Bundle main url forResource test w
  • 将 Eclipse Android 项目更新到下一个版本

    我在 Eclipse 中有一个 android 项目 我开始在 android 版本 2 2 中开发 我认为 我想更新该项目以在我的 2 3 3 设备上运行 有没有办法升级项目或者我需要创建一个新项目 因此 根据您的问题 我只想说 Andr
  • 修复发送信号中断系统调用时的竞争条件

    我有一个线程read 来自套接字 我希望能够异步停止线程 线程伪代码如下所示 int needs quit 0 void thread read void arg while 1 if needs quit close sock fd re
  • AlbersEqualArea 使用 lon 和 lat 限制区域

    我的数据是 100o 30o lon 和 0o 80o lat 我想使用投影来仅显示该区域 在我的脑海中 我想展示这样的情节 但是 当我尝试 AlbersEqualArea 投影时 如下所示 plt figure figsize 5 129
  • 使用 OkHttp、Okio 和 RxJava 下载文件

    我正在尝试使用 OkHttp 下载文件并使用 Okio 写入磁盘 我还为此过程创建了一个 rx observable 它正在工作 但是它比我以前使用的 Koush 的 Ion 库 明显慢 以下是我创建可观察对象的方法 public Obse