当前位置: 首页 > 知识库问答 >
问题:

okhttp3大文件下载中的OutOfMemoryError

楚权
2023-03-14

我正在尝试通过OKHTTP3html" target="_blank">下载zip文件(大小为160 Mb)。几秒钟后,应用程序与堆栈崩溃:

IllegalStateException:在scheduler.worker线程上引发的致命异常。在java.util.concurrent.executors$runnableadapter.call(executors.java:59)在java.util.concurrent.futuretask.run(futuretask.java:237)在java.util.concurrent.scheduledthreadpoolexecutor$scheduledfuturetask.run(scheduledthreadpoolexecutor.java:272)在java.util.concurrent.threadpoolexecutor.java:113),在:607)在java.lang.thread.run(thread.java:761)处造成:java.lang.outofMemoryError:未能分配8204字节的分配,1688个空闲字节和1688B直到OOM在OKIO.segment.(segment.java:61)在OKIO.segmentpool.take(Segmentpool.java:46)在OKIO.obuffer.writableSegment(buffer.java:1151)在OKIO.obkio$2处读取(ocio.java:136)在OKIO.asynctimeout$2处读取:45)位于okhttp3.internal.http.http1xstream$fixedlengthsource.read(http1xstream.jaVA:377)在OKIO.realBufferedSource.request(realBufferedSource.request(realBufferedSource.java:66)在OKHTTP3.logging.httpLoggingInterceptor.java:238)在OKHTTP3.internal.http.realInterceptorchain.proce(realInterceptorchain.java:92)在OKHTTP3.internal.http.realInterceptorchain.proce(realInterceptorchain.java:92)在.bvs.data.MapService$2.在rx.observable.unsafeSubScribe(observable.java:10142)html" target="_blank">调用(MapService.java:94)

下面是我的代码:

Observable.create((Observable.OnSubscribe<ResponseBody>) subscriber -> {
        Timber.e("Start zip loading");
        Request request = new Request.Builder()
                .url(Tweakables.DEV_API_ENDPOINT + "files/" + Tweakables.MAP_ZIP)
                .build();
        try {
            Response response = client.newCall(request).execute(); // Crash appeared at this line 
            subscriber.onNext(response.body());
            response.close();
        } catch (IOException e) {
            subscriber.onError(e);
        }
    })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<ResponseBody>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onNext(ResponseBody responseBody) {

                }
            });

共有1个答案

萧琛
2023-03-14

也许会对某人有帮助。通过使用改型注释解决了问题

@Streaming
@GET("files/"+Tweakables.MAP_ZIP)
Call<ResponseBody> downloadMap();
 类似资料:
  • 我有一个文件表示为块的列表,目标是下载所有块,加入并保存为一个文件。 它应该适用于大文件 应该是跨浏览器解决方案 null null null null 但我仍然无法实现我的目标与涵盖的需求… 如果有人有经验,最好的解决方案,我恳请分享它在这里。谢谢

  • 目前,我正在使用此代码来下载文件: 问题是当我尝试下载大文件时,代码会引发。 有没有其他方法可以避免这个错误来获取我的大文件? 编辑:另一个问题。 我正在考虑应用而不是: 和有什么区别?那个类会实现我的目标吗?

  • 问题内容: 我需要使用curl下载远程文件。 这是我的示例代码: 但是它不能处理大文件,因为它首先读取内存。 是否可以将文件直接流式传输到磁盘? 问题答案:

  • 我们有一个运行在Linux上的Weblogic服务器,有多个受管服务器。我所关心的托管服务器的最大堆大小为1024MB。该服务器上部署了多个应用程序。其中一个应用程序处理来自REST api的响应来下载250MB的文件。对于大于50 MB的文件,有时没有问题,但有时服务器会因OOM错误而崩溃。以下是我的代码: 由于存在内存问题,我尝试采用InpuStream方法。以下是更改后的代码: 此代码没有进

  • 我刚刚在google Drive中得到了一个500MB文件的大列表。我该如何在本地Linux机器上排队下载它们呢? 我不能把它们都压缩成一个大的下载 我无法将它们全部设置为一次下载 我不能整天都在这里小批量下载它们。 我从google drive的wget/curl大型文件这样的文档中看到,google drive的api被贬低了,我们不能wget它们。 所以我正在寻找一种从谷歌驱动器按顺序下载大

  • 当我运行下面的函数时,它下载源文件大约3分钟,然后关闭会话,即使一个1-1.6GB的文件只下载了38-41MB(变化)。 从Paramiko日志文件中可以看出,SSh连接在SFTP会话关闭时保持打开状态: DEB[20120913-10:05:00.894]Thr=1帕拉米科。运输:切换到新键...DEB[20120913-10:05:06.953]Thr=1 Paramiko。传输:重新密钥(命