通知设置 新通知
layanative打包的android项目顺序加载js文件,可能有些js加载后未执行的问题
哎呀嘛N号 发表了文章 • 0 个评论 • 1105 次浏览 • 2025-09-30 09:43
原因:
android项目中apploader.js文件,对js加载有个顺序处理方案,具体代码在Document.uploadScript中
uploadScript(d) {
var _t = this;
d.i = this._loading;
this._loading++;
if (d.src) {
console.log("_downloadAysn:temp.src" + d.src);
window.downloadfile(d.src, false, function (data) {
d._stext = data + "\n//@ sourceURL=" + d.src;
_t._downloadOk(d);
}, function () {
var e = new Event("error");
e.target = e.currentTarget = d.obj;
d.obj.onerror && d.obj.onerror(e);
});
}
else {
d._stext = d.text;
_t._downloadOk(d);
}
}
_downloadOk(d) {
this.scriptTextList[d.i] = d;
for (var i = this._evalNum, len = this.scriptTextList.length; i < len; i++) {
var t = this.scriptTextList[i];
if (!t)
return;
console.log(">>>>>>>>>>>>>>>eval src=" + t.src);
var t1 = Date.now();
window.document["currentScript"] = t.src;
window.evalJS(t._stext);
console.log(">>>>>>>>>>>>>>>>>eval take time:" + (Date.now() - t1));
var e = new Event("load");
e.target = e.currentTarget = t.obj;
t.obj.onload && t.obj.onload(e);
this._evalNum++;
}
if (this._loading == this._evalNum) {
this._loading = this._evalNum = 0;
this.scriptTextList.length = 0;
}
}
上面这段代码中,会有一个问题,如果window.downloadfile触发了下载失败的话,就会导致下载失败的那个文件始终在列表 scriptTextList中是空的,比如:下载0、 1、2、3、4、5这几个js文件,如果1下载失败,那么即使2、3、4、5全部加载完毕,回调_downloadOk方法时,_evalNum始终都是从1开始,在for循环中,scriptTextList[1] 始终都是null,这就导致2、3、4、5这几个js文件即使加载完成了,也无法执行 window.evalJS(js文件内容)。
处理方式:
在确保有这些js文件的前提下,把下载方法单独提出来,加载失败后,每隔500毫秒继续加载,直至加载完成
uploadScript(d) {
var _t = this;
d.i = this._loading;
this._loading++;
this._downLoadFile(d, _t);
}
_downLoadFile(d, _t) {
if (d.src) {
console.log("_downloadAysn:temp.src" + d.src + ", id:" + d.i);
window.downloadfile(d.src, false, function (data) {
d._stext = data + "\n//@ sourceURL=" + d.src;
_t._downloadOk(d);
}, function () {
var e = new Event("error");
e.target = e.currentTarget = d.obj;
d.obj.onerror && d.obj.onerror(e);
setTimeout(_t._downLoadFile, 500, d, _t);
});
}
else {
d._stext = d.text;
_t._downloadOk(d);
}
}
_downloadOk(d) {
this.scriptTextList[d.i] = d;
for (var i = this._evalNum, len = this.scriptTextList.length; i < len; i++) {
var t = this.scriptTextList[i];
if (!t)
return;
console.log(">>>>>>>>>>>>>>>eval src=" + t.src);
var t1 = Date.now();
window.document["currentScript"] = t.src;
window.evalJS(t._stext);
console.log(">>>>>>>>>>>>>>>>>eval take time:" + (Date.now() - t1));
var e = new Event("load");
e.target = e.currentTarget = t.obj;
t.obj.onload && t.obj.onload(e);
this._evalNum++;
}
按照上面这种改法,能确保所有js都正常加载,亲测有效 查看全部
原因:
android项目中apploader.js文件,对js加载有个顺序处理方案,具体代码在Document.uploadScript中
uploadScript(d) {
var _t = this;
d.i = this._loading;
this._loading++;
if (d.src) {
console.log("_downloadAysn:temp.src" + d.src);
window.downloadfile(d.src, false, function (data) {
d._stext = data + "\n//@ sourceURL=" + d.src;
_t._downloadOk(d);
}, function () {
var e = new Event("error");
e.target = e.currentTarget = d.obj;
d.obj.onerror && d.obj.onerror(e);
});
}
else {
d._stext = d.text;
_t._downloadOk(d);
}
}
_downloadOk(d) {
this.scriptTextList[d.i] = d;
for (var i = this._evalNum, len = this.scriptTextList.length; i < len; i++) {
var t = this.scriptTextList[i];
if (!t)
return;
console.log(">>>>>>>>>>>>>>>eval src=" + t.src);
var t1 = Date.now();
window.document["currentScript"] = t.src;
window.evalJS(t._stext);
console.log(">>>>>>>>>>>>>>>>>eval take time:" + (Date.now() - t1));
var e = new Event("load");
e.target = e.currentTarget = t.obj;
t.obj.onload && t.obj.onload(e);
this._evalNum++;
}
if (this._loading == this._evalNum) {
this._loading = this._evalNum = 0;
this.scriptTextList.length = 0;
}
}
上面这段代码中,会有一个问题,如果window.downloadfile触发了下载失败的话,就会导致下载失败的那个文件始终在列表 scriptTextList中是空的,比如:下载0、 1、2、3、4、5这几个js文件,如果1下载失败,那么即使2、3、4、5全部加载完毕,回调_downloadOk方法时,_evalNum始终都是从1开始,在for循环中,scriptTextList[1] 始终都是null,这就导致2、3、4、5这几个js文件即使加载完成了,也无法执行 window.evalJS(js文件内容)。
处理方式:
在确保有这些js文件的前提下,把下载方法单独提出来,加载失败后,每隔500毫秒继续加载,直至加载完成
uploadScript(d) {
var _t = this;
d.i = this._loading;
this._loading++;
this._downLoadFile(d, _t);
}
_downLoadFile(d, _t) {
if (d.src) {
console.log("_downloadAysn:temp.src" + d.src + ", id:" + d.i);
window.downloadfile(d.src, false, function (data) {
d._stext = data + "\n//@ sourceURL=" + d.src;
_t._downloadOk(d);
}, function () {
var e = new Event("error");
e.target = e.currentTarget = d.obj;
d.obj.onerror && d.obj.onerror(e);
setTimeout(_t._downLoadFile, 500, d, _t);
});
}
else {
d._stext = d.text;
_t._downloadOk(d);
}
}
_downloadOk(d) {
this.scriptTextList[d.i] = d;
for (var i = this._evalNum, len = this.scriptTextList.length; i < len; i++) {
var t = this.scriptTextList[i];
if (!t)
return;
console.log(">>>>>>>>>>>>>>>eval src=" + t.src);
var t1 = Date.now();
window.document["currentScript"] = t.src;
window.evalJS(t._stext);
console.log(">>>>>>>>>>>>>>>>>eval take time:" + (Date.now() - t1));
var e = new Event("load");
e.target = e.currentTarget = t.obj;
t.obj.onload && t.obj.onload(e);
this._evalNum++;
}
按照上面这种改法,能确保所有js都正常加载,亲测有效
[LayaAir3] laya ts怎么获取JSBridge方法里面 返回的byte[]数据
回复188*****945 回复了问题 • 2 人关注 • 1 个回复 • 2102 次浏览 • 2025-09-29 09:39
[LayaAir3] layaair3.2 打包的ios使用VideoNode无法播放视频
回复188*****945 回复了问题 • 1 人关注 • 1 个回复 • 2141 次浏览 • 2025-09-29 09:39
[LayaNative2] 安卓下播放mp3格式背景音乐无法循环播放
UCoyote 回复了问题 • 已解决 • 2 人关注 • 2 个回复 • 1974 次浏览 • 2025-09-28 15:18
[LayaAir3] 构建发布安卓 资源目录下只有初始场景
LayaAir小牛 回复了问题 • 2 人关注 • 1 个回复 • 942 次浏览 • 2025-09-27 09:41
[LayaNative3] 3.2.8发布android项目不断切换清理资源后native内存一直涨
回复哎呀嘛N号 发起了问题 • 1 人关注 • 0 个回复 • 1310 次浏览 • 2025-09-24 15:47
[LayaNative3] laya3.3.1 IDE打包的apk,运行时要求相册权限
lv 回复了问题 • 2 人关注 • 1 个回复 • 1227 次浏览 • 2025-09-18 10:09
[LayaNative2] LayaNative 2.0源码 怎么适配Google play 16kb页面?
layabox 回复了问题 • 已解决 • 4 人关注 • 2 个回复 • 1988 次浏览 • 2025-09-17 18:34
[LayaAir3] 是否支持Google Play 16 KB 页面
LayaAir大为 回复了问题 • 已解决 • 3 人关注 • 1 个回复 • 1074 次浏览 • 2025-09-16 09:46
[LayaAirIDE2] Laya2.13 是否支持Google Play 16 KB 页面
LayaAir大为 回复了问题 • 已解决 • 2 人关注 • 1 个回复 • 1146 次浏览 • 2025-09-03 11:01
[LayaAirIDE3] 3.1.6版本关于ASTC压缩,显存显著降低了,但是相比不压缩版本android的Native Heap多了不少
回复skK 发起了问题 • 1 人关注 • 0 个回复 • 1140 次浏览 • 2025-08-28 17:37
[LayaNative3] 最新版3.3正式版导出ios工程运行后声音播放不出来
layabox 回复了问题 • 已解决 • 2 人关注 • 1 个回复 • 1636 次浏览 • 2025-08-20 19:03
[LayaNative3] 安卓native里面怎么js发送消息
layabox 回复了问题 • 已解决 • 2 人关注 • 1 个回复 • 1391 次浏览 • 2025-08-20 19:01
[LayaNative3] 请教一下laya的dcc是怎么用的?
回复1617866298用户 发起了问题 • 1 人关注 • 0 个回复 • 1311 次浏览 • 2025-08-20 16:52
[LayaNative3] 如何设置默认字体?
layabox 回复了问题 • 已解决 • 3 人关注 • 1 个回复 • 1322 次浏览 • 2025-08-20 16:42
[LayaAir3] 请问layanative下如何读取选择的本地图片?
layabox 回复了问题 • 3 人关注 • 1 个回复 • 1594 次浏览 • 2025-08-19 19:03
[LayaAir3] 使用videoNode播放视频没有控制器
layabox 回复了问题 • 已解决 • 2 人关注 • 1 个回复 • 658 次浏览 • 2025-08-19 11:33
[LayaAir2] natvie 模型clone后回收内存泄露
lv 回复了问题 • 3 人关注 • 3 个回复 • 3025 次浏览 • 2025-08-14 10:53
[LayaNative2] LayaNative2如何在不重启进行切换不同dcc cdn地址,或者同域名下的不同cdn dcc目录
lv 回复了问题 • 2 人关注 • 3 个回复 • 927 次浏览 • 2025-07-30 13:44
[LayaNative 3.0] 原生Android打包支持vuikan吗
layabox 回复了问题 • 已解决 • 2 人关注 • 1 个回复 • 1798 次浏览 • 2025-07-11 10:55