[v3.5.0] 网速慢的时候热更错误

  • Creator 版本:v 3.5.0

  • 目标平台:Android

  • 重现方式:使用官方热更教程制作热更包。手机使用 4G网络 或者是 比较慢的WIFI,就会报错

  • 首个报错:

2022-05-10 22:03:54.891 21814-21937/com.test.abb W/System.err: org.cocos2dx.okhttp3.internal.http2.StreamResetException: stream was reset: CANCEL
2022-05-10 22:03:54.892 21814-21937/com.test.abb W/System.err:     at org.cocos2dx.okhttp3.internal.http2.Http2Stream$FramingSource.read(Http2Stream.java:420)
2022-05-10 22:03:54.892 21814-21937/com.test.abb W/System.err:     at org.cocos2dx.okhttp3.internal.http2.Http2Codec$StreamFinishingSource.read(Http2Codec.java:205)
2022-05-10 22:03:54.892 21814-21937/com.test.abb W/System.err:     at org.cocos2dx.okio.RealBufferedSource$1.read(RealBufferedSource.java:439)
2022-05-10 22:03:54.892 21814-21937/com.test.abb W/System.err:     at java.io.InputStream.read(InputStream.java:101)
2022-05-10 22:03:54.893 21814-21937/com.test.abb W/System.err:     at com.cocos.lib.CocosDownloader$3$2.onResponse(CocosDownloader.java:247)
2022-05-10 22:03:54.893 21814-21937/com.test.abb W/System.err:     at org.cocos2dx.okhttp3.RealCall$AsyncCall.execute(RealCall.java:203)
2022-05-10 22:03:54.893 21814-21937/com.test.abb W/System.err:     at org.cocos2dx.okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
2022-05-10 22:03:54.893 21814-21937/com.test.abb W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2022-05-10 22:03:54.894 21814-21937/com.test.abb W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2022-05-10 22:03:54.894 21814-21937/com.test.abb W/System.err:     at java.lang.Thread.run(Thread.java:919)
  • 手机型号:xiaomi mix3

  • 重现概率:必现

请问一下这个应该如何解决?

3.X我并不清楚,但是在2.x上,下载是有个45秒的超时限制的,这个超时并不是指建立下载连接的超时,而是整个下载时长的超时,我并不清楚官方为什么这样做,但是,这样在网速差或下载大文件时很容易超时。我自己的项目是已经改为建立连接超时,目前使用正常。

谢谢,看了下源码,的确设置的是整个请求的时间,我把这里改一下试试。

楼主,怎么改,能不能顺便说一下

2.4.8版本,在Cocos2dxDownloader.java中,约第100行,将.callTimeout(timeoutInSeconds, TimeUnit.SECONDS) 改为.connectTimeout(timeoutInSeconds, TimeUnit.SECONDS)

整个方法如下:

    public static Cocos2dxDownloader createDownloader(int id, int timeoutInSeconds, String tempFileSuffix, int maxProcessingTasks) {
        Cocos2dxDownloader downloader = new Cocos2dxDownloader();
        downloader._id = id;

        if (timeoutInSeconds > 0) {
            downloader._httpClient = new OkHttpClient().newBuilder()
                    .followRedirects(true)
                    .followSslRedirects(true)
//                    .callTimeout(timeoutInSeconds, TimeUnit.SECONDS)
                    .connectTimeout(timeoutInSeconds, TimeUnit.SECONDS)
                    .protocols(Collections.singletonList(Protocol.HTTP_1_1))
                    .build();
        } else {
            downloader._httpClient = new OkHttpClient().newBuilder()
                    .followRedirects(true)
                    .followSslRedirects(true)
                    .protocols(Collections.singletonList(Protocol.HTTP_1_1))
                    .build();
        }

        downloader._tempFileNameSuffix = tempFileSuffix;
        downloader._countOfMaxProcessingTasks = maxProcessingTasks;
        return downloader;
    }
2赞

哦哦谢谢大佬,改源码才能行哈哈哈,真难

1赞

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。