uni-app Android 手动kill进程大概率会报java.util.ConcurrentModificationException
uni-app Android 手动kill进程大概率会报java.util.ConcurrentModificationException
产品分类:
uniapp/App
PC开发环境操作系统:
Mac
PC开发环境操作系统版本号:
13.4
HBuilderX类型:
正式
HBuilderX版本号:
3.99
手机系统:
Android
手机系统版本号:
Android 11
手机厂商:
小米
手机机型:
Redmi Note 11 Pro
页面类型:
vue
vue版本:
vue2
打包方式:
云端
项目创建方式:
HBuilderX
示例代码:
不需要代码,用HBuilderX创建一个默认的项目,手动kill,大概率会触发
操作步骤:
不需要代码,用HBuilderX创建一个默认的项目,手动kill,大概率会触发
预期结果:
不报运行时异常
实际结果:
报运行时异常
bug描述:
iOS没问题,Android的APP手动kill后,大概率会报java.lang.RuntimeException: Unable to destroy activity {io.dcloud.HBuilder/io.dcloud.PandoraEntryActivity}: java.util.ConcurrentModificationException
HBuilderX 4.11.2024040401-alpha 已修复。
好的
有完整日志吗 麻烦提供下,一般某些业务逻辑正在执行时,强制杀进程或销毁activity可能会造成异常情况
日志放在下面了
回复 DCloud_Android_ST: 好的
回复 DCloud_Android_ST: 咋样了?
回复 Fatman: 具体请关注HX版本更新的release
日志
加你QQ了。 确认一下问题
我晕,难道这是一个系统问题吗?我还以为是我把VUE2升级到VUE3出的奇怪bug,查了一下午!!!
提供一下QQ,我们确认一下问题
你一回复就有人改了
在使用 uni-app 开发 Android 应用时,如果手动 kill 进程,确实有可能会遇到 java.util.ConcurrentModificationException
异常。这个异常通常是由于在遍历集合(如 ArrayList
、HashMap
等)时,同时对集合进行了修改(如添加、删除元素)而导致的。
原因分析
- 异步操作:uni-app 中可能使用了异步操作(如网络请求、定时器等),这些操作可能在应用被 kill 时仍在执行,导致集合被并发修改。
- 生命周期管理:应用被 kill 时,生命周期方法可能没有被正确执行,导致资源释放或状态保存时出现并发问题。
- 多线程问题:如果应用中使用了多线程,且没有正确同步对共享资源的访问,也可能导致
ConcurrentModificationException
。
解决方案
-
同步访问集合:在遍历集合时,确保没有其他线程对集合进行修改。可以使用
Collections.synchronizedList
或Collections.synchronizedMap
来包装集合,并在遍历时使用同步块。List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>()); synchronized (synchronizedList) { for (String item : synchronizedList) { // 处理 item } }
-
使用线程安全的集合:考虑使用线程安全的集合类,如
CopyOnWriteArrayList
或ConcurrentHashMap
,这些集合在并发环境下更加安全。List<String> copyOnWriteList = new CopyOnWriteArrayList<>(); for (String item : copyOnWriteList) { // 处理 item }
-
生命周期管理:确保在应用被 kill 时,正确执行生命周期方法,释放资源并保存状态。可以在
onDestroy
或onTerminate
方法中进行清理操作。@Override protected void onDestroy() { super.onDestroy(); // 释放资源 }