2012-06-10 15 views
7

मुझे अपने ऐप के साथ निम्नलिखित अपवाद मिल रहा है। मेरा मानना ​​है कि ऐसा तब होता है जब उपयोगकर्ता लंबे समय तक ऐप छोड़ देता है और उसके बाद वापस आता है। मैं इसे दोहराने में असमर्थ हूं हालांकि यह मेरे क्रैश लॉग में बहुत कुछ दिखा रहा है। मुझे नहीं पता कि यह क्यों हो रहा है इसलिए किसी भी सुझाव की सराहना की जाती है।सहेजे गए राज्य अपवाद

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // line 235 

मेरे onSaveInstanceState() बहुत सरल है::

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MyActivity}: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237) 
at android.app.ActivityThread.access$600(ActivityThread.java:139) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:4974) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at java.util.ArrayList.get(ArrayList.java:306) 
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1764) 
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:198) 
at com.myapp.MyActivity.onCreate(MyActivity.java:235) 
at android.app.Activity.performCreate(Activity.java:4538) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) 
... 11 more 

लाइन 235 निम्नलिखित है

@Override 
public void onSaveInstanceState(Bundle state) { 
    super.onSaveInstanceState(state); 

    state.putInt("id1", id1); 
    state.putInt("id2", id2); 
    state.putInt("id3", id3); 
    state.putInt("id4", id4); 

} 
+0

क्योंकि ID1 आईडी 2, ID3 में से एक, id4 जब -1 के बराबर है:

if (savedInstanceState != null) { final FragmentTransaction ft = getFragmentManager().beginTransaction(); final DialogFragment df = (DialogFragment) getFragmentManager().findFragmentByTag("tag"); if (df != null) { df.dismiss(); // ft.remove(df); frag = new MyDialogFragment(); frag.show(getFragmentManager(), "tag"); } ft.addToBackStack(null); ft.commit(); } 

पूर्णता के लिए के लिए, यह मैं onSaveInstanceState(final Bundle outstate) में क्या किया है है आप इसे बचा रहे हैं? – Blundell

+0

उन्हें कभी भी -1 नहीं होना चाहिए, हालांकि, मैं int मामलों के मूल्य पर विश्वास नहीं करता हूं। – Nick

+0

क्या आप निश्चित हैं कि रेखा 235 वह रेखा है। जिस लॉग से आपको लॉग मिला है वह वही है जो आप जांच रहे हैं? – Blundell

उत्तर

4

मैं इस एक ही समस्या में पड़ गए, मैं यह एंड्रॉयड के साथ एक बग विश्वास करते हैं।

FragmentManager.enableDebugLogging(true); 

यह प्रदर्शित करेगा:

मैं निम्नलिखित प्रयोग किया है: एक संभव समाधान http://code.google.com/p/android/issues/detail?id=22404

+0

मुझे यकीन नहीं है कि यह एक ही बग है या नहीं। लाइन नंबर बंद हैं। बेशक यह एक ही बग के साथ समर्थन पुस्तकालय का एक अलग संस्करण हो सकता है ... या यह एक अलग बग हो सकता है। – P1r4nh4

2

मैं ठीक उसी समस्या मिल गया के लिए इस सूत्र पर एक नजर डालें, मैं केनी के लिंक में दी गई सलाह का पालन लॉग इन FragmentManager पर सभी कॉल (टुकड़े जोड़े गए, हटाए गए, छुपा आदि)।

यह मुझे देखने के लिए अनुमति देता है कि मेरे मामले में क्या गलत था, मेरे ऐप में से एक टुकड़े कभी-कभी उदाहरण में ठीक से सहेजे नहीं गए थे और इसकी सामग्री शून्य थी।

तब दुर्घटना उसी त्रुटि लॉग के साथ हुई जब ऐप ने उदाहरण से इस शून्य खंड को पुनर्स्थापित करने का प्रयास किया।

मेरे मामले में यह टुकड़ा थोड़ा खास था और स्वचालित रूप से बनाया गया था। यह सुनिश्चित करने के लिए कि त्रुटि फिर से न प्राप्त करें, मैंने Activity से बाहर निकलने से पहले FragmentManager से खंड हटा दिया।

+2

'FragmentManager.enableDebugLogging (सत्य) के लिए उपरोक्त ' – Robert

0

मुझे वही समस्या थी, जो अभिविन्यास परिवर्तन के साथ हुई थी, लेकिन यह केवल पुराने एंड्रॉइड संस्करणों (4.0.4) के साथ हुआ, 4.4.2 जैसे नए संस्करण ठीक थे। मैं आपके साथ साझा करना चाहता हूं कि मैंने इसे कैसे तय किया।

के रूप में केनी और योआन सुझाव दिया, मैं

FragmentManager.enableDebugLogging(true); 

का इस्तेमाल किया और पता चला कि बहुत ज्यादा दूर करने किया गया है। मुझे अपने कोड से ft.remove(df) को हटाना पड़ा और अब यह ऊपर वर्णित दोनों संस्करणों के साथ ठीक है। यह मेरा कोड है:

if (frag != null) { 
    getFragmentManager().putFragment(outState, "tag", frag); 
} 
संबंधित मुद्दे