ConcurrentModificationException重叠两个活动

时间:2013-04-29 00:02:42

标签: android

我的主要活动使用自定义画布视图活动填充了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状态,进行某种类型的保存过程,这会与重叠活动的工作产生冲突。

我是对的吗?

如果是,如何同步两个活动之间的访问?

如果这个故事错了,问题出在哪里?

谢谢

0 个答案:

没有答案