私のメイン アクティビティには、カスタム キャンバス ビュー アクティビティで拡張された RelativeLayout があります。ユーザーが画面を長押しすると、Main アクティビティ内の「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 はメイン アクティビティと重複する 2 番目のアクティビティを起動します (閉じずに)。
// 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) で正常に動作しますが、一部のデバイスでは、2 番目のアクティビティを開くと 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がスローされます同じように。"
しかし、関心のあるコード部分内にリスト配列、ハッシュマップ、またはイテレータはありません(私から作成されたものではありません)。
問題は、2 番目のオーバーラップ アクティビティを開くメイン アクティビティが OnPause 状態になり、何らかの保存プロセスが行われ、オーバーラップ アクティビティの作業と競合することだと思います。
私は正しいですか?
はいの場合、2 つのアクティビティ間でアクセスを同期するにはどうすればよいですか?
この理論が間違っているとすれば、どこに問題があるのでしょうか?
ありがとう