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();
			}
		});
	}
}


03-24 10:03:02.511 E/JavaBinder( 1498): *** Uncaught remote exception! Exceptions are not yet supported across processes. Client PID 5018 UID 10130. 03-24 10:03:02.511 E/JavaBinder( 1498): java.lang.IndexOutOfBoundsException: Index 202 out of bounds for length 202 03-24 10:03:02.511 E/JavaBinder( 1498): at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 03-24 10:03:02.511 E/JavaBinder( 1498): at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 03-24 10:03:02.511 E/JavaBinder( 1498): at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) 03-24 10:03:02.511 E/JavaBinder( 1498): at java.util.Objects.checkIndex(Objects.java:359) 03-24 10:03:02.511 E/JavaBinder( 1498): at java.util.ArrayList.get(ArrayList.java:434) 03-24 10:03:02.511 E/JavaBinder( 1498): at com.oplus.internal.telephony.regionlock.RegionLockState.getDataByOffset(RegionLockState.java:443) 03-24 10:03:02.511 E/JavaBinder( 1498): at com.oplus.internal.telephony.regionlock.RegionLockState.bytesToRegionlockState(RegionLockState.java:489) 03-24 10:03:02.511 E/JavaBinder( 1498): at com.oplus.internal.telephony.regionlock.RegionLockController.updateRegionlockBlob(RegionLockController.java:2056) 03-24 10:03:02.511 E/JavaBinder( 1498): at com.oplus.internal.telephony.regionlock.RegionLockController.handleRegionlockEvent(RegionLockController.java:1968) 03-24 10:03:02.511 E/JavaBinder( 1498): at com.android.internal.telephony.OplusTelephonyExtServiceImpl.requestTelephonyEvent(OplusTelephonyExtServiceImpl.java:488) 03-24 10:03:02.511 E/JavaBinder( 1498): at com.android.internal.telephony.OplusTelephonyExtServiceImpl$1.requestForTelephonyEvent(OplusTelephonyExtServiceImpl.java:311) 03-24 10:03:02.511 E/JavaBinder( 1498): at com.android.internal.telephony.IOplusTelephonyExt$Stub.onTransact(IOplusTelephonyExt.java:123) 03-24 10:03:02.511 E/JavaBinder( 1498): at android.os.Binder.execTransactInternal(Binder.java:1500) 03-24 10:03:02.511 E/JavaBinde
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值