| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 记一次 kotlin 在 MutableList 中使用 remove 引发的问题 -> 正文阅读 |
|
[移动开发]记一次 kotlin 在 MutableList 中使用 remove 引发的问题 |
背景我开发的APP,隐云图解制作 中有一个功能是拼接多个 gif 动图到一张动图上。 这段代码是使用 FFmpeg 来实现。 测试时发现直接水平拼接和直接横向拼接都没有问题,唯独方形拼接(类似九宫格)在开启按比例缩放后总是出现问题。 而这段代码的核心逻辑是先遍历输入文件列表,读取每个 gif 的尺寸信息并将其保存下来,同时按照特定拼接规则计算出缩放尺寸并保存。 然后将计算得到的尺寸生成 FFmpeg 命令。 排查过程使用四张分辨率分别为:
生成的 FFmpeg 命令为:
把上述命令中的其他参数移除,仅保留缩放和拼接命令,并适当的加点缩进:
稍微解释一下上述命令: 上述缩放中的代码表示把输入的第 n 个文件按照 x:y 分辨率缩放后取别名为 xxx,如:
而拼接中的代码也很好理解,如:
解释完,各位有没有发现问题?没有?哈哈,没有就对了,等我画个图就理解了。 按照预想情况,拼接后的动图应该是这样排列的: (哈哈哈,因为这里只是用极端个例来说明这个现象,所以拼出来的是这么一个奇怪的形状) 但是实际情况确实这样的: 哈哈,发现问题了吧。 拼接的方向居然反了,如果只是反了到也还能看,关键是连同缩放尺寸一起反了,导致 16:9 的动图被强行拉伸成了 9:16,而原本 9:16 的动图又被强行压缩成了 16:9 ,那观感,简直不要太惨不忍睹。 那么造成这种情况的原因是什么呢? 先看代码:
上述代码中, 但是此处,为了方便返回数据,我会在原有 list 末尾再添加两条数据,并且在遍历前将这两条数据通过 此时再去遍历这个 list 就出现了上述所说的顺序错乱。 所以合理猜测是由于调用了 remove 导致顺序被重新排列了? 我们写一段 demo 来尝试一下:
不出意外,输出结果为:
果然 list 被重新排序了。 那么问题来了,为什么呢?又该怎么解决呢? 错误原因及解决方法既然已经知道了问题出自于 先来看看 remove 的源码:
嗯,是个接口,问题不大,找到它的实现:
代码很简单,核心就在第3-4行,使用 indexOf 查找到元素位置后调用 removeAt 删除。 哈哈,看出问题没有? 其实去我在刚写完背景时就突然发现了问题所在,但是想着写都写了,还是假装不知道继续写下去吧。 什么?还是没看出来问题所在? 那么我们来看看 indexOf 的源码……算了,源码都不用看了,直接看注释:
看到了吗?这个方法返回的是“指定元素第一次出现的索引位置” 也就是说,调用 remove 后删除的是第一个该元素。 我们再来看看上述代码返回的删除前后的 list 变化:
发现了吗?并不是删除元素后 list 被重排了,只是好巧不巧的,我想删除最后一个 那么问题来了,它凭什么就说这两个 再看一段代码:
这又是为什么??? 哈哈哈,这个问题留给各位自己想了。 总之,最后的解决方法也很简单,因为我需要删除的元素索引是固定的,所以只需要把代码中的:
改为:
参考资料原文发表于我的博客:Likehide.com |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 3:35:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |