起因原ATRI文本文件大小为1.6MB，而watch gt这破表加载300KB的文本文件时，不管是import的形式，还是storage的形式，亦或是file.read的形式，都会卡到重启。于是，在此背景下研究了一个分块加载文本的代码格式举个例子我有如下一个json的文本列表，我就会在达到某一个条件时加载其中符合条件的那个。PS：之前试过使用require分块加载，但是还是会报错，不知道是系统原因还是啥原因，人家小米全import加载都不会报错(jsonDataList: [ 'b999.json', 'b101.json', 'b102.json', 'b103.json', 'b111.json', 'b112.json', 'b113.json', 'b114.json', 'b121.json', 'b122.json', 'b123.json', 'b124.json', 'b200.json', 'b201.json', 'b202.json', 'b203.json', 'b204.json', 'b205.json', 'b206.json', 'b207.json', 'b301.json', 'b302.json', 'b303.json', 'b304.json', 'b401.json', 'b402.json', 'b403.json', 'b404.json', 'b405.json', 'b406.json', 'b407.json', 'b501.json', 'b601.json', 'b701.json' ],如下代码为ATRI加载文本文件使用的方法PS:原计划是将文本放在本地的，但是我不会读取读取本地文件，开发文档也没讲，寄！async loadData(chapter) { const num = this.jsonDataList[chapter]; // 将回调转换为Promise return new Promise((resolve, reject) => { file.readText({ uri: `internal://files/${num}`, success: (data) => { try { const parsedData = JSON.parse(data.text); resolve(parsedData); // 正确传递解析后的数据 } catch (e) { reject("JSON解析失败"); } }, fail: (_, code) => { reject(`文件读取失败，错误码：${code}`); } }); }); },最近在做一个可查找的词典，但是由于词库过大，加载200KB的索引会卡死，于是将索引分为26份，按照首字母（全部转化为小写）进行查找，不必将所有索引全部加载，实现按需查找的功能，并且也不会爆内存，完美！下面给出我写的下载模块，因为watch gt不支持数据块传输，所以只能使用全部下载字节流的方式了：import fetch from '@blueos.network.fetch' import file from '@blueos.storage.file' import prompt from '@blueos.window.prompt' export default { data: { indexData: null, jsonDataList: ['output_part_1.json'], }, async fetchPromise(options) { return new Promise((resolve, reject) => { fetch.fetch({ ...options, success: resolve, fail: reject, }); }); }, async writeTextPromise(options) { return new Promise((resolve, reject) => { file.writeText({ ...options, success: resolve, fail: (data, code) => reject({ data, code }), }); }); }, async writeArrayBufferPromise(options) { return new Promise((resolve, reject) => { file.writeArrayBuffer({ ...options, success: resolve, fail: (data, code) => reject({ data, code }), }); }); }, async getFile(fileName) { return new Promise((resolve, reject) => { file.get({ uri: `internal://files/${fileName}`, success: () => { resolve(true); }, fail: (_, code) => { reject(`handling fail, code = ${code}`); }, }); }); }, async downloadFile(data) { prompt.showToast({ message: "开始下载" }); let totalNum = data.length; let hasDownload = 0; for (let i = 0; i < totalNum; i++) { const fileName = data[i]; let isInFile = false; try { isInFile = await this.getFile(fileName); } catch (error) { console.log(error); } if (isInFile) hasDownload++; if (!isInFile) { try { let fileUri = `internal://files/${fileName}`; let baseUrl = 'https://chorblack.top' const chunkResponse = await this.fetchPromise({ url: `${baseUrl}/app/dictionary/${fileName}`, responseType: "arraybuffer", }); const textData = chunkResponse.data; await this.writeArrayBufferPromise({ uri: fileUri, buffer: new Uint8Array(textData), }); prompt.showToast({ message: `还剩${data.length - i - 1}` }) hasDownload++; } catch (error) { console.error(`下载失败: ${fileName}`, error); } } } if (hasDownload==totalNum) prompt.showToast({ message: "下载完成" }); } }下面提供分块传输的方法： {{ title }}
准备工具：视频文件Python一个电脑（可以联网）预备工具下载步骤：抽取视频帧图片找到你想要开始的视频时间，如图1中所示为1:01，即61秒；找到你想要结束的视频时间，如图2中所示为1:03，即63秒；图1图2打开python代码：提取保存png.py图3将开始时间和结束时间填入所示的框内，如图3所示，运行代码，在同目录下会出现一个文件夹：output，如图4所示图4运行代码后在output中生成了一系列图片，如图5所示图5找到图片帧截取位置准备一个图片截取工具，如画图、ps等，如图6、图7所示，推荐ps，本文将使用ps进行演示；图6图7首先查看图片的分辨率大小，如图8所示，本文使用的视频分辨率为2560×1080图8由于要截取的图片我需要保持宽度不变，那么由计算得知：$$\frac{390}{450} = \frac{x}{1080}$$得出x约等于936从ps边界线处拉出两条参考线，如图9所示，先确认第一条线的位置，再在第一条线的坐标上加上刚才的x值，本文为936，即为第二条线的坐标值；如果你的图像中心对称，你也可以通过计算得出第一条线的横坐标a：$$a = \frac{2560}{2} - \frac{936}{2} = 812$$图9计算完成后，点击第一条线，右击，选择"编辑所选参考线"，将得到的a填入，再将a加上半个x，得到第二条线的坐标值，填入看看效果，如图10所示；图10确认完成后，将python代码：切割图片png.py复制到output文件夹内，打开代码，在所选框中填入如下四个数值：以左上角为坐标原点，右方向为x正方向，下方向为y正方向，切割图片起始横坐标a、切割图片起始纵坐标（本文为0）、裁剪宽度x、裁剪长度（本文为1080），运行代码，在output下生成了一个output文件夹，如图11、图12所示：图11图12图片分辨率、大小修改选取图片帧范围，本文选取了frame_001852.png\~frame_001890.png，然后打开网址：resize-images进行图片分辨率修改，如图14所示：Why：由于性能因素以及rpk包限制，建议将图片分辨率设置为与表盘分辨率一致；图14将所选图片拖入后，点击右侧"添加尺寸"，按照图15所示，设置格式为png、宽度为390、高度为450、图片布局选择自适应，确认选项后点击开始；图15为保证图片命名具有规律性，点击重命名，自定义命名、数字、补零等，如图16所示，确认后点击下载zip将图片包下载下来并解压：图16解压之后，点击compress-images进行图片压缩，由此来减少rpk包的大小，如图17所示（我要是能装上原版大小图片的包我还会压缩？）图17同样的，将上次重置分辨率的图片全部拖进去，选择无损，点击开始，如果你压缩后包小于2MB，恭喜你，不需要进有损压缩了，如果压缩后包大小仍然大于2MB，点击返回，选择自定义，数值越大图片越糊，选择合适的大小，将图片包控制在2MB左右，如图18所示：小技巧：如果你某些部分不需要太高分辨率，可以进行分块压缩，需要好的显示的可以使用无损压缩，对于如特效等不需要仔细显示的可以使用数值大一点的自定义压缩。图18这样，我们所需要的图像帧资源就得到了编辑表盘代码将图像资源放入对应的表盘文件夹中，在data中找到frames项，填写图片个数与图片路径，本文使用的是52张图片，路径规则如图19所示：Ps：duration项控制着图片帧的播放速率，本文使用的是50ms，即20帧；图19到此，你就可以成功将表盘运行起来了，当然你仍需要进行一些配置来保证安装，更改manifest.json的数据：更改package，即包名，命名格式可以是域名反转或中间；更改屏幕尺寸，watch gt为390，watch 3为466；更换id和name，id是表盘唯一标识，id相同则无法安装，因此有一个独特的id能保证你安装成功，name则为表盘显得的名称，图21中的name也需更改；previewImage为预览图，显示在表盘切换界面；图20图21到此为止，表盘制作成功，其他内容请查看蓝河开发文档：vivo蓝河应用开发感谢观看，如果觉得有用的话，请投喂我哦~编写者：澪编写时间：2025.4.12QQ：1562818788博客主页