cocos creator 2.4.5版本下,使用jsb.downloader下载文件,只有以下四个API可以使用,如何中断下载任务?论坛找了一圈,就没见到咋解决的!

export class Downloader{
/**
* create a download task
* @param requestURL
* @param storagePath
* @param identifier
*/
createDownloadFileTask (requestURL:string, storagePath:string, identifier?:string): DownloaderTask;

    setOnFileTaskSuccess (onSucceed: (task: DownloaderTask) => void): void;

    setOnTaskProgress (onProgress: (task: DownloaderTask, bytesReceived: number, totalBytesReceived: number, totalBytesExpected: number) => void): void;

    setOnTaskError (onError: (task: DownloaderTask, errorCode: number, errorCodeInternal: number, errorStr: string) => void): void;

}

你创建的Downloader变量 应该是个全局或者类变量吧 你把它值空,刷新一下 自然就中断了

进入某个页面,设置全局的 _downloader = null
下载文件是这样用的:
if (!this._downloader) {
this._downloader = new jsb.Downloader()
}
this._downloader.setOnTaskError(function (task, errorCode, errorCodeInternal, errorStr) {
}.bind(this))
this._downloader.setOnTaskProgress(function (task, bytesReceived, totalBytesReceived, totalBytesExpected) {
var str = "下载大小 = " + bytesReceived + “,” + "总大小 = " + totalBytesReceived + “,” +
"预期总大小 = " + totalBytesExpected + “,” + "进度 = " + Math.floor(totalBytesReceived / totalBytesExpected * 10000) / 100 + “%\n”
console.log("progress: " + str)
}.bind(this))
this._downloader.setOnFileTaskSuccess(function (task) {
console.log(task.requestURL + "download success " + task.storagePath)
}.bind(this))

        let task = this._downloader.createDownloadFileTask(fileUrl, filePath, "downloadFile")
}

退出的时候把_downloader = null 了,但是没用,页面都干掉了,setOnTaskProgress的log还在持续输出,直到下载完成,根本停不下来

那个人乱讲的。从原理角度就不会是那样

你定义的变量 被滞空,被垃圾回收了 它还能存在?

jsb的下载是在native层执行的。并不是js层。你拿到的js组件只是一个通讯实例。所以它是否存在,跟底层是否在进行传输,并无直接关系。
我是完全重写了cocos 2.4.4引擎的这一块,自己实现的热更。所以对这个还是有足够的信心跟你对线的。

我经常再逻辑层下载大文件 经常超时,那么就需要重新下载,重新下载的方式就是重新建立一个对象 继续下载,如果按你说的 引擎层不释放资源 还继续下 那么就会有多个下载任务同时在下载同一个文件 并写到同一个临时文件里,那么这种过程 就要出错了,但结果是正常的 说明前面的下载的任务 会被中断,对象消除掉了

1、你那个属于重试机制。事实上跟底层资源管理并没直接关联。
2、以现在设备的体量,就算真浪费了资源,泄漏在那里,你是感觉不到的。

还有,你说的前提是超时,也就是原本的任务已经停止了。
再说,底层其实可以让你多个downloader使用同一个下载任务的引用,只要url一致,这些技术上都是可能的。
再说一个,就是cocos的downloader下载回调有bug,会丢失任务。我给官方报过。

抱歉引擎组目前精力不会放在 2.x 上了,如果用最新版(目前是 3.7.3)遇到的问题我们会比较关注。这里帮忙艾特一下技术支持团队的 @215194780 ,虽然他主要也是看 3.x 的问题。

是在标题上@215194780 ?

就是在这里 @ 就行

@215194780 恳请大佬关注此问题,我们这里好几个项目都是用的2.4.5版本,暂时没需求升级到3.x版本,所以想在当前版本2.4.5解决问题

abort 没导出 :cold_sweat:

我干脆都放弃了你们这个没人维护的下载和升级功能。。。
我用的版本也比较老,知道你们不会再改进。

我正在尝试导出abort :sob:

不用非得超时啊 下载中 也可以人为停止的 比如下载时间过长 用户想停止 那就让用户中断就是了 过一会用户可能还要想继续,那就继续,如果按你说的 后台还再继续下载 那也是冲突的 但实际上运行正常

static bool js_network_Downloader_abort(se::State& s)
{
cocos2d::network::Downloader* cobj = (cocos2d::network::Downloader*) s.nativeThisObject();
SE_PRECONDITION2(cobj, false, “js_network_Downloader_abort : Invalid Native Object”);

const auto& args = s.args();
size_t argc = args.size();

CC_UNUSED bool ok = true;
if(argc == 1) {
	cocos2d::network::DownloadTask *arg0;
	ok &= seval_to_native_ptr(args[0], &arg0);
	SE_PRECONDITION2(ok, false, "js_network_Downloader_abort : Error processing arguments");
	cobj->abort(*arg0);
	return true;
}
SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1);
return false;

}

ok &= seval_to_native_ptr(args[0], &arg0); 到这句错误了,没法转换,seval_to_native_ptr 里的T ptr = (T)v.toObject()->getPrivateData(); 出错了,为null

请教大神该如何正确转换?

你所谓的清除对象并不能起到这个作用。不信要么你问问官方。
或者我承认你说的都对也行。
毕竟我不是干script boy的,我的视角也不是只看到脚本层。

@215194780 这个问题没法解决了吗?