2012-04-29 22 views
7

की ओर लौटने मैं एक प्रवाह मोटे तौर पर यह है कि के साथ एक आवेदन पत्र है:आशय एक्स्ट्रा कलाकार खो जब गतिविधि

  • प्रारंभ मुख्य गतिविधि, कुछ डेटा
  • प्रारंभ गतिविधि एक में प्रवेश, आशय
  • में एक भी स्ट्रिंग गुजर
  • गतिविधि एक स्ट्रिंग का उपयोग करता है और उपयोगकर्ता कुछ विकल्प
  • कभी कभी उपयोग गतिविधि बी शुरू कर देंगे (पृष्ठभूमि में एक छोड़कर)
  • जब बी गतिविधि एक गतिविधि से उपयोगकर्ता रिटर्न निर्मित किया जाता है (देता है मैं onCreate एस कहा जाता है); मुझे लगता है यह स्मृति
  • आशय getIntent() द्वारा दिए गए डेटा गतिविधि के मूल उदाहरण के लिए पारित एक

मैं डेटा जानते हैं क्योंकि पहली कॉल में था नहीं है को बचाने के लिए हटा दिया गया है ऐप मर जाएगा अगर यह नहीं था।

मुझे पता है कि उपयोगकर्ता गतिविधि ए ('बैक' कुंजी के माध्यम से) पर वापस लौटने पर डेटा नहीं होता है क्योंकि ऐप मर जाता है (extre.getString (...) पर null पॉइंटर ऑनक्रेट())।

क्या यह इरादा व्यवहार है?

क्या मुझे अतिरिक्त बचत बंडल की सामग्री सहेजना चाहिए SaveInstanceState()?

संपादित:

... 
Bundle extras = getIntent().getExtras(); 
mIsbn = extras.getString("isbn"); 
String by = extras.getString(BY); 
... 

और थोड़ी देर बाद इसे इस्तेमाल करता है:

Intent i = new Intent(a, BookISBNSearch.class); 
i.putExtra(BookISBNSearch.BY, "isbn"); 
a.startActivityForResult(i, R.id.ACTIVITY_CREATE_BOOK_ISBN); 

BookISBNSearch में onCreate इस पर लिखा है:

मुख्य गतिविधि का उपयोग नई गतिविधि शुरू होता है: नीचे दिए कोड स्निपेट

if (mIsbn != null) { 
    ....do some stuff.... 
} else if (by.equals("isbn")) { 
    ....do some other stuff.... 

उपयोगकर्ता BookISBNSearch से दूसरी गतिविधि शुरू कर सकता है। कोड है कि नई गतिविधि शुरू होता है:

/* 
* Start scanner activity. 
*/ 
private void startScannerActivity() { 
    if (mScannerIntent == null) { 
     mScannerIntent = new Intent("com.google.zxing.client.android.SCAN"); 
    } 
    if (!mScannerStarted) { 
     mScannerStarted = true; 
     startActivityForResult(mScannerIntent, ACTIVITY_SCAN); 
    } 
} 

उपयोगकर्ता स्कैनर चलाता है, अन्य सामग्री का एक समूह होता है, और अंत में इस गतिविधि पर लौटने के लिए 'वापस' कुँजी प्रेस। उस बिंदु पर उन्हें नीचे सूचीबद्ध क्रैश मिलता है। प्रासंगिक हिस्सा:

at com.eleybourn.bookcatalogue.BookISBNSearch.onCreate(BookISBNSearch.java:142) 

लाइन से मेल खाती है:

} else if (by.equals("isbn")) { 

जहाँ से मैं निष्कर्ष है कि रिक्त है 'से'।

आगे, अन्य संभावित कोड पथ अन्य (गैर-बाहरी) गतिविधियों को शुरू करते हैं जो एक ही समस्या को प्रदर्शित करते हैं। यह मेरे फोन में नहीं होता है, न ही एवीडी में ऑटो-डिलीटिंग गतिविधियों के साथ भी चालू होता है।

यह केवल उपयोगकर्ताओं के एक छोटे अनुपात के लिए होता है।

java.lang.NullPointerException 
at com.eleybourn.bookcatalogue.BookISBNSearch.onCreate(BookISBNSearch.java:142) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3691) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) 
at dalvik.system.NativeStart.main(Native Method) 
+3

हमें कोड का वर्णन करने के बजाय आप इसे पेस्ट करना चाहिए। कोई अन्यथा आपकी मदद नहीं कर सकता है। – Aidanc

+0

हो गया। कोड ऊपर जोड़ा गया। – RabidMutant

उत्तर

1

सहेजे गए इंस्टेंस में अपना इरादा-डेटा लिखने का प्रयास करें!

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(getIntent() != null) { 
     // Activity was started and got an Intent with data 
     ... 
    } else if(savedInstanceState != null) { 
     // No intent is available, try getting data from savedInstance 
     ... 
    } 

} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    if(outState != null) { 
     // Write here your data 
     ... 
    } 
} 

मुझे आशा है कि यह उपयोगी था :)

+0

ऑनक्रेट * है * कहा जाता है। इसका कारण यह है कि गतिविधि को मुक्त स्मृति में हटा दिया गया था। – RabidMutant

+0

फिर सहेजे गए इन्स्टेंटबंडल – kyp

+1

पर अपना इरादा डेटा लिखें हां, यह मैंने सुझाए गए काम के आसपास है। मेरा सवाल है * एंड्रॉइड को अतिरिक्त संरक्षित करना चाहिए (यानी यह एक बग है)। – RabidMutant

संबंधित मुद्दे