Android并发修改异常:java.util.ConcurrentModificationException

简介: Android并发修改异常:java.util.ConcurrentModificationException

1.异常原因:


网上很多出现并发修改异常的情况都是和集合有关,而我的情况是在将Activity清除出栈的时候出现的异常,其他的情况暂未遇到,碰到再更新。


2.分析解决:


我在之前的《 如何在本Activity页面退出后回到首页或者指定的Activity入口》中提到会出现并发修改异常的情况:我从A 主页--> B --> C --> D 页面,当想结束当前页面,直接回到A页面时,就需要将B、C 清除出任务栈,但在清除时若只是finish当前页面显然是不能直接回到A页面的,直接跳转的方式更不可取,会出现很多个Activity,造成很多问题。用我在该文内的工具类时,必须按顺序先清除C,再清除B;若中间BC不清,或者只有C忘记清除的情况下都会造成异常 java.util.ConcurrentModificationException。(注:这里只是举个例子,这样操作就会造成并发修改异常。)


3.个人理解(此部分仅供参考,纯属个人经验之谈,未必准确。):


以上造成并发修改异常的原因主要与activity的任务栈有关(具体任务栈原理,请大家自行找资料学习)。根据任务栈“后进先出”的特点,D处在当前任务栈的栈顶,想找到A,必须按顺序清除中间的C、B;不能跳过B、C直接找到A,更不可能跳过C去直接清除B。对任务栈内的元素进行操作,需理解其原理,根据其特点进行添加或者删除操作,避免发生类似的异常java.util.ConcurrentModificationException。


4.出现异常的部分代码示例:(示例全部代码)

/**
 * @author 诺诺
 * 
 */
public class EActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    AppManager.getAppManager().addActivity(this);
    TextView tv = (TextView) findViewById(R.id.tv);
    tv.setText("返回首页");
    tv.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        AppManager.getAppManager().finishActivity(DActivity.class);
        // AppManager.getAppManager().finishActivity(CActivity.class);
        AppManager.getAppManager().finishActivity(BActivity.class);
        finish();
      }
    });
  }
}
目录
相关文章
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
28天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
5天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
7天前
|
Java 开发者
Java中多线程并发控制的实现与优化
【4月更文挑战第17天】 在现代软件开发中,多线程编程已成为提升应用性能和响应能力的关键手段。特别是在Java语言中,由于其平台无关性和强大的运行时环境,多线程技术的应用尤为广泛。本文将深入探讨Java多线程的并发控制机制,包括基本的同步方法、死锁问题以及高级并发工具如java.util.concurrent包的使用。通过分析多线程环境下的竞态条件、资源争夺和线程协调问题,我们提出了一系列实现和优化策略,旨在帮助开发者构建更加健壮、高效的多线程应用。
7 0
|
8天前
|
存储 缓存 安全
Java并发基础之互斥同步、非阻塞同步、指令重排与volatile
在Java中,多线程编程常常涉及到共享数据的访问,这时候就需要考虑线程安全问题。Java提供了多种机制来实现线程安全,其中包括互斥同步(Mutex Synchronization)、非阻塞同步(Non-blocking Synchronization)、以及volatile关键字等。 互斥同步(Mutex Synchronization) 互斥同步是一种基本的同步手段,它要求在任何时刻,只有一个线程可以执行某个方法或某个代码块,其他线程必须等待。Java中的synchronized关键字就是实现互斥同步的常用手段。当一个线程进入一个synchronized方法或代码块时,它需要先获得锁,如果
24 0
|
16天前
|
Java
Java中的异常类总结
Java中的异常类总结
|
16天前
|
存储 缓存 安全
【企业级理解】高效并发之Java内存模型
【企业级理解】高效并发之Java内存模型
|
23天前
|
安全 Java
Java中的多线程并发控制
在Java中,多线程是实现并发执行任务的一种重要方式。然而,随着多个线程同时访问共享资源,可能会导致数据不一致和其他并发问题。因此,了解并掌握Java中的多线程并发控制机制显得尤为重要。本文将深入探讨Java的多线程并发控制,包括synchronized关键字、Lock接口、Semaphore类以及CountDownLatch类等,并通过实例代码演示其使用方法和注意事项。
12 2
|
28天前
|
缓存 NoSQL Java
Java项目:支持并发的秒杀项目(基于Redis)
Java项目:支持并发的秒杀项目(基于Redis)
26 0