我的主要活动有一个用自定义画布视图活动膨胀的 RelativeLayout。当用户长按屏幕时,会调用 Main Activity 内部的一个名为“touched”的方法。
// inside the Custom View Activity
final Handler handler = new Handler();
Runnable mLongPressed = new Runnable() {
public void run() {
if (undoFlag) { undo(); }
longPressed=true;
((ScorePadActivity)getContext()).touched();}
};
在此方法中,Intent 会启动与主要活动重叠的第二个活动(不关闭它)。
// inside the main activity
public void touched() {
Intent intent = new Intent(ScorePadActivity.this, Chords_Activity.class);
startActivityForResult(intent,CREATE_CHORDS); }
在此用户可以选择一系列按钮,当关闭时,结果将传输到(恢复的)主活动。
// inside the overlapped activity
private void trasmitResult(Bitmap resultBmp2) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
resultBmp2.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent resultIntent = new Intent();
resultIntent.putExtra("ResultChord", byteArray);
setResult(Activity.RESULT_OK, resultIntent);
//byteArray=null;
Chords_Activity.this.finish();
}
这在大多数设备和 Android 版本(从 2.3 到 4.1)上都可以正常工作,但在某些设备上,有时打开第二个活动会返回 ConcurrentModificationException 错误。
04-29 00:57:10.400: E/AndroidRuntime(9209): FATAL EXCEPTION: main
04-29 00:57:10.400: E/AndroidRuntime(9209): java.util.ConcurrentModificationException
04-29 00:57:10.400: E/AndroidRuntime(9209): at java.util.HashMap$HashIterator.nextEntry(HashMap.java:792)
04-29 00:57:10.400: E/AndroidRuntime(9209): at java.util.HashMap$EntryIterator.next(HashMap.java:829)
04-29 00:57:10.400: E/AndroidRuntime(9209): at java.util.HashMap$EntryIterator.next(HashMap.java:827)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.os.Parcel.writeMapInternal(Parcel.java:491)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.os.Parcel.writeBundle(Parcel.java:507)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:1948)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.app.ActivityThread.handleStopActivity(ActivityThread.java:2866)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.app.ActivityThread.access$900(ActivityThread.java:123)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.os.Handler.dispatchMessage(Handler.java:99)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.os.Looper.loop(Looper.java:137)
04-29 00:57:10.400: E/AndroidRuntime(9209): at android.app.ActivityThread.main(ActivityThread.java:4424)
04-29 00:57:10.400: E/AndroidRuntime(9209): at java.lang.reflect.Method.invokeNative(Native Method)
04-29 00:57:10.400: E/AndroidRuntime(9209): at java.lang.reflect.Method.invoke(Method.java:511)
04-29 00:57:10.400: E/AndroidRuntime(9209): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-29 00:57:10.400: E/AndroidRuntime(9209): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-29 00:57:10.400: E/AndroidRuntime(9209): at dalvik.system.NativeStart.main(Native Method)
我已经在 SO 内部进行了搜索,但是所有关于 ConcurrentModificationException 的帖子都与迭代器或列表数组有关,无论如何,来自 Google:“当修改集合并且集合上的现有迭代器用于修改集合时,会引发 ConcurrentModificationException也一样。”
但是感兴趣的代码部分内没有列表数组、哈希图或迭代器(不是我创建的)。
我认为问题在于主要活动,打开第二个重叠活动,进入 OnPause 状态,进行某种类型的保存过程,这与重叠活动的工作产生冲突。
我对吗?
如果是,如何同步两个活动之间的访问?
如果这个理论是错误的,问题出在哪里?
谢谢