如何判断Codename One downloadUrlToFileSystemInBackground下载失败并删除残损文件
刚好对Codename One的下载机制比较熟悉,来给你详细解答这两个实际开发中常遇到的问题:
1. 判断
downloadUrlToFileSystemInBackground的下载是否失败 downloadUrlToFileSystemInBackground是异步方法,它本身提供了回调机制来直接监听下载的成功与失败,这是最可靠的判断方式:
你在调用方法时,需要传入两个回调对象:
SuccessCallback<File>:当下载完全成功时触发,参数里的File就是完整的下载文件FailureCallback<Throwable>:只要下载过程中出现任何异常(网络中断、文件写入失败、URL无效等),都会触发这个回调,Throwable参数会包含具体的失败原因
举个实际的代码示例:
String downloadUrl = "https://example.com/your-file.zip"; String saveFileName = "downloaded-file.zip"; FileSystemStorage fs = FileSystemStorage.getInstance(); String targetFilePath = fs.getAppHomePath() + saveFileName; // 调用下载方法并传入回调 DownloadService.downloadUrlToFileSystemInBackground(downloadUrl, targetFilePath, // 下载成功回调 completedFile -> { Log.p("下载成功!文件路径:" + completedFile.getAbsolutePath()); }, // 下载失败回调 error -> { Log.p("下载失败,原因:" + error.getMessage()); // 这里可以直接处理失败后的逻辑,比如删除不完整文件 } );
另外,如果你需要额外验证文件完整性(比如担心回调误判),可以预先获取文件的预期大小或哈希值,下载完成后对比实际文件的大小/哈希,不过这种情况属于补充验证,核心判断还是依赖回调。
2. 下载失败后删除FileStorage中的不完整文件
最直接的方式就是在下载失败的回调里执行删除操作,因为此时你已经明确知道下载失败,且持有目标文件的路径:
// 延续上面的代码,在失败回调中添加删除逻辑 error -> { Log.p("下载失败,原因:" + error.getMessage()); FileSystemStorage fs = FileSystemStorage.getInstance(); // 先检查文件是否存在,避免抛出异常 if (fs.exists(targetFilePath)) { boolean isDeleted = fs.delete(targetFilePath); if (isDeleted) { Log.p("不完整文件已成功删除"); } else { Log.p("删除不完整文件失败,可能是文件被占用"); } } }
如果是程序重启后才发现有遗留的不完整文件,你可以通过以下方式处理:
- 记录每个下载任务的预期文件大小(比如从接口获取或预先配置)
- 遍历FileStorage中的文件,对比实际文件大小与预期大小
- 如果实际大小小于预期,判定为不完整文件并删除
示例代码:
String targetFilePath = fs.getAppHomePath() + "downloaded-file.zip"; long expectedFileSize = 1024 * 1024; // 假设预期是1MB if (fs.exists(targetFilePath)) { long actualSize = fs.getLength(targetFilePath); if (actualSize < expectedFileSize) { fs.delete(targetFilePath); Log.p("清理了遗留的不完整文件"); } }
内容的提问来源于stack exchange,提问作者IfeFromKolopay
相关产品推荐
相关产品推荐

