我的主要活动使用自定义画布视图活动填充了RelativeLayout。 当用户在屏幕上使用longPress时,会调用Main活动中名为“touch”的方法。
// 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:“当修改Collection并使用Collection上的现有迭代器时,抛出ConcurrentModificationException修改收藏。“
但是感兴趣的代码部分中没有列表数组,哈希映射或迭代器(不是从我创建的)。
我认为问题在于,主要活动,打开第二个重叠活动,进入OnPause状态,进行某种类型的保存过程,这会与重叠活动的工作产生冲突。
我是对的吗?
如果是,如何同步两个活动之间的访问?
如果这个故事错了,问题出在哪里?
谢谢