uni-app Android 手动kill进程大概率会报java.util.ConcurrentModificationException

发布于 1周前 作者 gougou168 来自 Uni-App

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


15 回复

HBuilderX 4.11.2024040401-alpha 已修复。


有完整日志吗 麻烦提供下,一般某些业务逻辑正在执行时,强制杀进程或销毁activity可能会造成异常情况

日志放在下面了

回复 Fatman: 收到 已交给相关同学处理

回复 DCloud_Android_ST: 好的

回复 DCloud_Android_ST: 咋样了?

回复 Fatman: 具体请关注HX版本更新的release

加你QQ了。 确认一下问题

我晕,难道这是一个系统问题吗?我还以为是我把VUE2升级到VUE3出的奇怪bug,查了一下午!!!

提供一下QQ,我们确认一下问题

你一回复就有人改了

回复 DCloud_Android_DQQ: 我的qq号是330849971

在使用 uni-app 开发 Android 应用时,如果手动 kill 进程,确实有可能会遇到 java.util.ConcurrentModificationException 异常。这个异常通常是由于在遍历集合(如 ArrayListHashMap 等)时,同时对集合进行了修改(如添加、删除元素)而导致的。

原因分析

  1. 异步操作:uni-app 中可能使用了异步操作(如网络请求、定时器等),这些操作可能在应用被 kill 时仍在执行,导致集合被并发修改。
  2. 生命周期管理:应用被 kill 时,生命周期方法可能没有被正确执行,导致资源释放或状态保存时出现并发问题。
  3. 多线程问题:如果应用中使用了多线程,且没有正确同步对共享资源的访问,也可能导致 ConcurrentModificationException

解决方案

  1. 同步访问集合:在遍历集合时,确保没有其他线程对集合进行修改。可以使用 Collections.synchronizedListCollections.synchronizedMap 来包装集合,并在遍历时使用同步块。

    List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
    synchronized (synchronizedList) {
        for (String item : synchronizedList) {
            // 处理 item
        }
    }
  2. 使用线程安全的集合:考虑使用线程安全的集合类,如 CopyOnWriteArrayListConcurrentHashMap,这些集合在并发环境下更加安全。

    List<String> copyOnWriteList = new CopyOnWriteArrayList<>();
    for (String item : copyOnWriteList) {
        // 处理 item
    }
  3. 生命周期管理:确保在应用被 kill 时,正确执行生命周期方法,释放资源并保存状态。可以在 onDestroyonTerminate 方法中进行清理操作。

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 释放资源
    }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!