2010-07-28 34 views
5

अपने आवेदन में, कभी कभी निम्न अपवाद फेंक दिया जाता है:एंड्रॉइड: अवैध स्तर अपवाद - इसे कब फेंक दिया जाता है?

07-28 14:49:25.398: ERROR/AndroidRuntime(8097): 
java.lang.IllegalStateException: The content of the adapter has changed 
but ListView did not receive a notification. Make sure the content of 
your adapter is not modified from a background thread, but only from the 
UI thread. [in ListView(2131099717, class android.widget.ListView) with 
Adapter(class ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter)] 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.ListView.layoutChildren(ListView.java:1432) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.AbsListView.onLayout(AbsListView.java:1113) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1108) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.onLayout(LinearLayout.java:920) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.LinearLayout.onLayout(LinearLayout.java:918) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.View.layout(View.java:6831) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.ViewRoot.performTraversals(ViewRoot.java:996) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.os.Handler.dispatchMessage(Handler.java:99) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.os.Looper.loop(Looper.java:123) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
android.app.ActivityThread.main(ActivityThread.java:4338) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
java.lang.reflect.Method.invokeNative(Native Method) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
java.lang.reflect.Method.invoke(Method.java:521) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):  at 
dalvik.system.NativeStart.main(Native Method) 

यह मेरी विधियों में से कोई भी स्टैकट्रेस में सूचीबद्ध है क्योंकि, त्रुटि खोजने के लिए मुश्किल है। तो, क्या कोई अपवाद जानता है जब यह अपवाद फेंक दिया जाता है? किसी भी संकेत के लिए धन्यवाद।

उत्तर

3

आप अपने स्टैकट्रेस में त्रुटि देख सकते हैं:

एडाप्टर के सामग्री बदल गया है लेकिन ListView एक सूचना प्राप्त नहीं किया था। सुनिश्चित करें कि की सामग्री आपके एडाप्टर को पृष्ठभूमि थ्रेड से संशोधित नहीं किया गया है, लेकिन केवल UI थ्रेड से।

आपको अपने धागे में से एक को देखना चाहिए और इसे अपने यूआई थ्रेड के साथ सिंक्रनाइज़ करना चाहिए।

एंड्रॉइड में ऐसा करने का तरीका हैडलर के साथ है।

http://developer.android.com/guide/appendix/faq/commontasks.html#threading

+0

माइकल बी मुझे आपकी मदद की ज़रूरत है असल में मुझे भी वही त्रुटि मिल रही है, सवाल यह है कि http://stackoverflow.com/questions/16477755/application-stops-on-changing-page –

2

जहां आप ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter का उपयोग कर रहे हैं।

1

दरअसल, त्रुटि के इस प्रकार भेज दिया जाता है, जब आप अपने सूचीदृश्य या किसी अन्य दृश्य एक एडाप्टर है कि इसकी सामग्री अद्यतन किया जाना चाहिए का उपयोग कर सूचित किए बिना, अपने एडाप्टर की सामग्री को संशोधित।
एडाप्टर पर .notifyDataSetChanged() पर कॉल करने का प्रयास करें।

20

यह आपको बताता है कि त्रुटि में कक्षा होती है: ch.uzh.csg.games4blue.gamebase.view.UserView इसमें UserAdapter नामक एक कक्षा शामिल है।

मुझे समझाने के लिए यहाँ क्या हो रहा है की कोशिश करते हैं - आप एक उसका बैकअप लेने एक साथ ListViewAdapter, ListView इसके लिए एडाप्टर पूछकर अपने डेटा हो जाता है जब पैदा करते हैं। हर बार जब आप स्क्रॉल करते हैं, तो ListView आपके द्वारा स्क्रॉल किए गए नए आइटम के लिए एडाप्टर से पूछ रहा है।

आम तौर पर आप सूची दृश्य बनाते हैं, आप एडाप्टर बनाते हैं, आप एडवेंटर को सूचीदृश्य पर सेट करते हैं, और आप कर चुके हैं। एंड्रॉइड ओएस बाकी की देखभाल करता है। आप जो करने का प्रयास कर रहे हैं, वह थोड़ा और जटिल है। आप कभी-कभी एडाप्टर में डेटा को अपडेट करने का प्रयास कर रहे हैं। आप कल्पना कर सकते हैं कि एडाप्टर डेटा बदल गया है, तो सूचीदृश्य को सूचित करने की आवश्यकता होगी, है ना? यदि आप 2 आइटमों के साथ एक सूची प्रदर्शित कर रहे हैं, और आप अचानक एडाप्टर में 2 और आइटम जोड़ते हैं, तो सूची अब 4 आइटम प्रदर्शित करनी चाहिए! हालांकि, यह वास्तव में अक्षम होगा यदि सूचीदृश्य को लगातार यह देखने के लिए जांचना पड़ता था कि एडाप्टर बदल गया है, है ना? तो क्या होने की आवश्यकता है सूचीदृश्य यह मान लेगा कि एडाप्टर नहीं बदलता है, और अगर एडाप्टर बदलता है तो एडाप्टर सूचीदृश्य को सूचित करेगा। (सूचीदृश्य और एडाप्टर के बीच यह अनुबंध अन्य लाभों की अनुमति देता है, जैसे सूचीदृश्य त्वरित पहुंच के लिए एडाप्टर से पुनर्प्राप्त कुछ आइटम कैश कर सकता है। अगर उर्फ ​​स्क्रीन पर प्रदर्शित 10 सूची आइटम हैं, तो सूची वास्तव में पहले ही अनुरोध हो सकती है 14 आइटम। इस तरह यदि आप नीचे या नीचे स्क्रॉल करते हैं, तो कम से कम 2 आइटम किसी भी दिशा में सूची सूची में पहले से प्रदर्शित करने के लिए डेटा है!)

हालांकि, आप क्या करने में विफल रहे हैं, इस सूची को सूचित करना है कि एडाप्टर के अंदर डेटा बदल गया। उपयोगकर्ता एडाप्टर या उपयोगकर्ता के अंदर कहीं भी डेटा बदल रहा है! हर किसी पर यह आसान बनाने के लिए, शायद आप पूर्ण उपयोगकर्ता दृश्य वर्ग पोस्ट कर सकते हैं? मेरी शर्त यह है कि आपके पास कुछ डेटा ऑब्जेक्ट है जैसे कि ऐरेलिस्ट, उपयोगकर्ता व्यू क्लास के अंदर एक निजी चर के रूप में।UserAdapter क्लास के अंदर आप इस डेटा को ListView में प्रदान कर रहे हैं। हालांकि, उपयोगकर्ता दृश्य वर्ग के अंदर कहीं भी आप इस डेटासेट को संशोधित कर रहे हैं, के बाद आप इसे पहले से ही सूची दृश्य में प्रदान कर चुके हैं।

अस्वीकरण: मैं ज्यादातर अन्य उत्तर यहाँ प्रतिलिपि बनाई जा रही हूँ, लेकिन मुझे लगता है कि अगर मैं

दिया अस्वीकरण 2 2-3 जवाब गठबंधन मैं क्या हो रहा है की एक और अधिक स्पष्ट देखने प्रदान कर सकते हैं: मैं थक गया हूँ और यह खराब लिखा है। उम्मीद है कि कोई मेरी विकेट रात की गड़बड़ी को साफ करता है। यदि यह पूरी तरह से अस्पष्ट है सिर्फ इसलिए कहते हैं और बीमार यह

1

मैं एक ही समस्या यह है कि आप का सामना करना पड़ा रहा asynchrousTask उपयोग कर रहा था listview.I में डेटा कोड fn

  1. में Ui अद्यतन करता है कि दोबारा लिख ​​कर हल भरना हटाना onPostExecute()
  2. onPreExecute()

इन समारोह यूआई धागा में चलता है क्योंकि।

उम्मीद है कि इससे मदद मिलती है।

0

मैंने अभी यह तय किया है!

पहले मैं इस तरह भारी प्रसंस्करण कर रहा था, जहां list स्थिर और गतिविधि वर्ग के तहत किया गया:

@Override 
protected Void doInBackground(Void... arg0) { 
    for (int i=0; i<bigChunk.size(); i++) { 
     list.add(somethingHeavy(i)); 
    } 
} 

मैं फिर एक नई सूची बनाई है, और में यह कहा:

List<YourObject> listToAdd; 
@Override 
protected Void doInBackground(Void... arg0) { 
    listToAdd = new ArrayList<YourObject>(); 
    for (int i=0; i<bigChunk.size(); i++) { 
     listToAdd.add(somethingHeavy(i)); 
    } 
} 
@Override 
protected void onPostExecute(Void result) { 
    list = listToAdd; 
    adapter.notifyDataSetChanged(); 
} 
संबंधित मुद्दे