【Bug反馈,急】Android 原生采用cc.loader加载远程png图片没有调用回调函数

问题反馈

2.0.10版本的Cocos Creator无法在Android原生上加载远程.png 图片

描述

不确定是否为所有Android手机都会这样子,目前我这边Android 6.0.1 纯原生系统(非魔改系统)无法加载一张远程.png 图片

具体表现为 cc.loader.load() 中没有回调,无论成功还是失败的都没有

测试用例

测试图片地址:

ps:图片在海外,一开始以为翻墙问题,但是实际测试,无论翻墙前还是翻墙后都没有回调

测试代码:

static loadSpriteFrameFromRemote(imageUrl: string) {
    return new Promise<cc.SpriteFrame>((resolve, reject) => {
        if (imageUrl == null || imageUrl == "") {
            let error = new Error(`image url null`);
            if (CC_DEBUG) {
                  cc.error(error);
            }
            reject(error);
            return;
        }

        if (CC_DEBUG) {
            cc.log("开始加载远程图片: " + imageUrl);
        }
        if (imageUrl.endsWith(".jpg") || imageUrl.endsWith(".jpeg") || imageUrl.endsWith(".png")) {
            // 图片地址含后缀的下载方法
            cc.loader.load(imageUrl, (error: Error, texture: cc.Texture2D) => {
                if (error) {
                    if (CC_DEBUG) {
                        cc.error(`load (${imageUrl}) failed!`);
                        cc.error(error);
                    }
                    reject(error);
                    return;
                }
                if (CC_DEBUG) {
                    cc.log("成功加载远程图片: " + imageUrl);
                }
                resolve(new cc.SpriteFrame(texture));
            });
        } else {
            // 图片地址不含后缀的加载方法
            cc.loader.load(
                {
                    url: imageUrl,
                    type: "png"
                },
                (error: Error, texture: cc.Texture2D) => {
                    if (error) {
                        if (CC_DEBUG) {
                            cc.error(`load (${imageUrl}) failed!`);
                            cc.error(error);
                        }
                        reject(error);
                        return;
                    }
                    if (CC_DEBUG) {
                        cc.log("成功加载远程图片: " + imageUrl);
                    }
                    resolve(new cc.SpriteFrame(texture));
                }
            );
        }
    });
}

实际运行结果

问题在于没有输出错误或者成功的log,即没有回调

其他

同样类似的反馈帖子

@BigBear

补充一下,.jpg 是没问题的,就是 .png 存在问题

up,up

提供下可以测试的demo,烦请提供下国内可测试的资源!我们分析看看~

把 https 换成 http 就可以下载成功了。

这是这张图片的问题吗?所以要从 https 换成 http

还是说所有 https://xxx.png 的图片都要换成 http://xxx.png 呢?

另外,为什么会没有任何回调的呢?不一定说要下载成功,但是哪怕下载失败了,给回调,问题也不大,业务逻辑也能继续跑下去。但是没有回调这个事情,有点难搞。。。

确有此问题,我们会尽快修复。

给大佬端茶:slightly_smiling:
坐等好消息

感谢你的反馈,有同事在看,暂时先规避一下吧

表示关注

https://github.com/cocos-creator/cocos2d-x-lite/pull/2077
https://github.com/cocos-creator-packages/jsb-adapter/pull/245

大家好这个问题已经修复,并且在 2.3.0-rc-3 版本已经合并,会在 2.3.0 正式版发布。


creator mac版本2.2.2
用的iphone6跟踪代码测试
发现远程图片的下载器downloadImage在jsb-engine中被替换掉,而此处的方法中没有加入错误的回调监听,导致图片下载失败之后没有正确回调

你是测试的哪个平台?在我的测试中是能够正常执行回调的。

大佬的思路是正确的,大概率可能也是在 jsb-adapter 中覆盖 pipe 时的 downloader 漏了回调

IOS 平台,用真机测试的,不过后续已经在2.3版本中 发现被修复了