दिलचस्प पोस्ट
जावास्क्रिप्ट में यूटीएफ -8 शब्द सीमा regex मैं एक ही हिल छवि को कई बार कैसे आकर्षित करूं? कॉलम प्रकार सेट करने के लिए सभी ईएफ मॉडल में सभी गुणों के माध्यम से लूप / प्रतिबिंबित करें दो समान वस्तुओं एक दूसरे के बराबर क्यों नहीं हैं? एक TextView प्रोग्राम के रूप में लेआउट वजन सेट करें एक सर्वर से फेसबुक फैन पेज पर पोस्ट करने के लिए एक लंबे समय तक चलने वाले टोकन प्राप्त करने के कदम क्या हैं? निर्देशिका php में कितनी फाइलों की गणना करें पटरियों: लिंक (यूआरएल) को मान्य करने का एक अच्छा तरीका क्या है? XCode 6 में पीसीएच फ़ाइल एक गुण फाइल में एक पासवर्ड की सुरक्षा Windows मेजबान फ़ाइल में पोर्ट संख्या का उपयोग करना कास्टिंग और कन्वर्ट का उपयोग करने के बीच अंतर। () विधि समूह की संख्या जानने के बिना कमेन्स? चार एस और चार * एस में क्या अंतर है? मैं ईमेल में HTML प्रपत्र कैसे भेजूं .. सिर्फ मेलो नहीं

समवर्ती संशोधन अपवाद: एक ArrayList को जोड़ना

समस्या तब होती है

Element element = it.next(); 

और यह कोड जिसमें उस रेखा शामिल है, एक OnTouchEvent अंदर है

 for (Iterator<Element> it = mElements.iterator(); it.hasNext();){ Element element = it.next(); if(touchX > element.mX && touchX < element.mX + element.mBitmap.getWidth() && touchY > element.mY && touchY < element.mY + element.mBitmap.getHeight()) { //irrelevant stuff.. if(element.cFlag){ mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } } } 

यह सब synchronized(mElements) अंदर है, जहां mElements एक mElements ArrayList<Element>

जब मैं एक Element स्पर्श करता हूं, तो वह cFlag को सक्रिय कर सकता है, जो अलग-अलग गुणों के साथ एक और Element बना देगा, जो स्क्रीन से गिर जाएगी और एक सेकंड से भी कम समय में खुद को नष्ट कर देगा। यह कण प्रभाव पैदा करने का मेरा तरीका है हम इस "कण" crack को कंस्ट्रक्टर में स्ट्रिंग पैरामीटर की तरह कॉल कर सकते हैं।

यह सब ठीक काम करता है जब तक कि मैं किसी अन्य मुख्य Element जोड़ूं। अब मेरे पास एक ही समय में स्क्रीन पर दो Elements , और अगर मैं नवीनतम Element स्पर्श करता हूं, तो यह ठीक काम करता है, और कणों को लॉन्च करता है

हालांकि, अगर मैं पुराने Element पर cFlag को स्पर्श और सक्रिय करता cFlag , तो यह मुझे अपवाद देता है।

  07-28 15:36:59.815: ERROR/AndroidRuntime(4026): FATAL EXCEPTION: main 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): java.util.ConcurrentModificationException 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.Juggle2.Panel.onTouchEvent(Panel.java:823) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.View.dispatchTouchEvent(View.java:3766) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1767) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1119) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1751) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.os.Handler.dispatchMessage(Handler.java:99) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.os.Looper.loop(Looper.java:123) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.app.ActivityThread.main(ActivityThread.java:4627) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at java.lang.reflect.Method.invokeNative(Native Method) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at java.lang.reflect.Method.invoke(Method.java:521) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:651) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at dalvik.system.NativeStart.main(Native Method) 

मै इसे काम मे कैसे ले सकता हूँ?

वेब के समाधान से एकत्रित समाधान "समवर्ती संशोधन अपवाद: एक ArrayList को जोड़ना"

ConcurrentModificationException तब होता है जब आप Iterator साथ एक सूची में चलते समय सूची (तत्वों को जोड़कर या हटाकर) संशोधित करते हैं

प्रयत्न

 List<Element> thingsToBeAdd = new ArrayList<Element>(); for(Iterator<Element> it = mElements.iterator(); it.hasNext();) { Element element = it.next(); if(...) { //irrelevant stuff.. if(element.cFlag){ // mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); thingsToBeAdd.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } } } mElements.addAll(thingsToBeAdd ); 

जॉन के सुझाव के रूप में आपको प्रत्येक लूप के लिए बढ़ाया जाना चाहिए।

मैं आमतौर पर इस तरह से कुछ का उपयोग करें:

 for (Element element : new ArrayList<Element>(mElements)) { ... } 

त्वरित, स्वच्छ और बग मुक्त

एक अन्य विकल्प CopyOnWriteArrayList का उपयोग करना है

आपको किसी संग्रह में एक प्रविष्टि जोड़ने की अनुमति नहीं है, जब तक आप इसे फिर से कर रहे हैं

एक विकल्प नई प्रविष्टियों के लिए List<Element> को नई प्रविष्टियों के लिए mElements , जब आप mElements पर पुनरावृत्त हो mElements , और उसके बाद सभी नए लोगों को mElement बाद में जोड़ें ( mElements.addAll(newElements) )। बेशक, इसका मतलब है कि आप उन नए तत्वों के लिए लूप बॉडी को निष्पादित नहीं करेंगे – क्या यह समस्या है?

उसी समय, मैं सुझा था कि आप लूप के लिए एन्हांस्ड उपयोग करने के लिए अपना कोड अपडेट करें:

 for (Element element : mElements) { ... } 

लूप के लिए अनुक्रमित भी काम करना चाहिए।

 for (int i = 0; i < collection.size(); i++) 

इस मामले में सूची से जोड़ना सीएमई की ओर जाता है, synchronized की कोई भी राशि आपको इससे बचने नहीं देगी इसके बजाय, इटरेटर का उपयोग करने पर विचार करें …

  for(ListIterator<Element> it = mElements.listIterator(); it.hasNext();){ Element element = it.next(); if(touchX > element.mX && touchX < element.mX + element.mBitmap.getWidth() && touchY > element.mY && touchY < element.mY + element.mBitmap.getHeight()) { //irrelevant stuff.. if(element.cFlag){ // mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); it.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } } } 

इसके अलावा मुझे लगता है कि यह राज्य की तरह कुछ फिसलन है …

Element element = it.next(); पर समस्या आती है Element element = it.next();

परिशुद्धता के लिए ध्यान दें कि ऊपर की गारंटी नहीं है।

एपीआई प्रलेखन बताते हैं कि इस … व्यवहार की गारंटी नहीं दी जा सकती क्योंकि यह आम तौर पर बोल रहा है, बिना किसी संक्रमित समवर्ती संशोधन की उपस्थिति में किसी भी कठोर गारंटी के लिए असंभव है। असफल-तेज संचालन सर्वश्रेष्ठ-प्रयास के आधार पर समवर्ती सुधार को अपनाने …

Iterators का उपयोग भी concurrency समस्याओं को हल करता है, इस तरह:

 Iterator<Object> it = iterator.next().iterator(); while (it.hasNext()) { it.remove(); } 

मैंने अपने मामले में सभी पहलुओं की कोशिश की है, जहां मैं एक एडेप्टर में एक सूची बदल रहा था लेकिन फिर से और फिर से मारने के कारण मुझे दिखाया गया कि अपवाद का संदेश फेंका गया है। मैंने सूची को कास्ट करने की कोशिश की

  = (CopyOnWriteArraylist<MyClass>)mylist.value; 

लेकिन यह भी मुझे सीनोटकस्ट एक्सपैशन के अपवाद को फेंक दिया, (और मैंने अंततः इस तथ्य पर विचार किया कि वे क्यों का उपयोग करते हैं या हमें ढलाई की एक विशेषता प्रदान करते हैं)

मैंने भी तथाकथित सिंक्रनाइज़ ब्लॉक का भी इस्तेमाल किया, लेकिन यह भी काम नहीं कर रहा था या मैं इसे गलत तरीके से इस्तेमाल कर रहा होता।

इस प्रकार यह तब था जब मैंने आखिरकार # सभी समय का इस्तेमाल किया + अपवाद को पकड़ने के प्रयास में अपवाद को संभालने की तकनीक, और यह काम किया, इसलिए अपना कोड डालकर

 try{ //block }catch(ConcurrentModificationException){ //thus handling my code over here }