2012-10-09 32 views
10

कहा जा रहा है, मैंने अपने एंड्रॉइड ऐप में एप्लिकेशन क्लास को अधिभारित कर लिया है और मैं ACRA रिपोर्ट सिस्टम का उपयोग कर रहा हूं। मेरा ऐप की तरह (real source code here) दिखता है:एंड्रॉइड एप्लिकेशन क्लास विधि को कई बार

public class MyApplication extends Application 
{ 
    @Override 
    public void onCreate() {   
     ACRA.init(this); 

     /* 
     * Initialize my singletons etc 
     * ... 
     * ... 
     */ 
     super.onCreate(); 
    } 
} 

और जहाँ तक मुझे पता है, आवेदन वस्तु केवल एक बार बनाया जाना चाहिए, ताकि onCreate विधि केवल एक बार बुलाया जाना चाहिए। समस्या है, मैं इस किया है (ACRA से) मेरी क्रैश रिपोर्ट में:

java.lang.RuntimeException: Unable to create service it.evilsocket.myapp.net.N ... 
java.lang.RuntimeException: Unable to create service it.evilsocket.myapp.net.NetworkMonitorService: java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: **java.lang.IllegalStateException: ACRA#init called more than once** 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2283) 
    at android.app.ActivityThread.access$1600(ActivityThread.java:127) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4441) 
    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.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: java.lang.IllegalStateException: ACRA#init called more than once 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:495) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269) 
    ... 10 more 
Caused by: java.lang.IllegalStateException: ACRA#init called more than once 
    at org.acra.ACRA.init(ACRA.java:118) 
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492) 
    ... 11 more 
java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: java.lang.IllegalStateException: ACRA#init called more than once 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:495) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269) 
    at android.app.ActivityThread.access$1600(ActivityThread.java:127) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4441) 
    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.IllegalStateException: ACRA#init called more than once 
    at org.acra.ACRA.init(ACRA.java:118) 
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492) 
    ... 11 more 
java.lang.IllegalStateException: ACRA#init called more than once 
    at org.acra.ACRA.init(ACRA.java:118) 
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269) 
    at android.app.ActivityThread.access$1600(ActivityThread.java:127) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4441) 
    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) 

तो यह एप्लिकेशन onCreate कई बार बुलाया जा रहा है, इस पर किसी भी विचार की तरह लगता?

नोट:

  • मेरी एंड्रॉयड एक्सएमएल में प्रकट, मैं किया एंड्रॉयड का उपयोग नहीं: प्रक्रिया = "स्ट्रिंग" विशेषता।
  • हाँ, मुझे यकीन है कि कि मेरे आरंभीकरण दिनचर्या में मैं कर रहा हूँ नहीं गलती से MyApplication.onCreate बुला रहा हूँ।
+3

मैं गतिविधि.ऑनक्रेट के बारे में बात नहीं कर रहा हूं (जिसे आमतौर पर कॉन्फ़िगरेशन परिवर्तन होने पर हर बार बुलाया जाता है), लेकिन एप्लिकेशन.ऑनक्रेट! –

+0

क्या आपने यहां ब्रेकपॉइंट सेट करने का प्रयास किया है? – CommonsWare

+0

यह कुछ है जो मैं अपने डिवाइस पर पुन: पेश नहीं कर सकता, मैं इसे एसीआरए रिपोर्ट से देखता हूं ... अगर मैं वहां तोड़ता हूं या लॉग डी डालता हूं, तो क्रिएट को केवल मेरे स्मार्टफोन और टैबलेट दोनों पर ही कॉल किया जाता है। –

उत्तर

6

यदि आप स्टैक ट्रेस देखते हैं, तो ऐसा लगता है कि ACRA.initmakeApplication पर कॉल कर रहा है। मुझे संदेह है कि यह जांचने के लिए कुछ प्रकार का कोड है कि एप्लिकेशन पहले से ही बनाया गया है और यदि नहीं, तो इसे बनाएं और यह super.onCreate से पहले आपके कॉलिंग के कारण होता है। आम तौर पर onCreate विधियों को ओवरराइड करते समय (चाहे Application या Activity) आपके कार्यान्वयन की पहली पंक्ति के रूप में super.onCreate पर कॉल करने की अनुशंसा की जाती है और बाद में अपनी कस्टम सामग्री करें। मैं उसे एक शॉट दूंगा और देख सकता हूं कि यह चीजों को ठीक करता है या नहीं।

+0

यह एक स्पष्टीकरण हो सकता है। मैंने सुपर से पहले एक इनिट के साथ एसीआरए दस्तावेज किया।एसीआरए रिपोर्ट अपवादों को देने के लिए ऑन क्रिएट() को एप्लिकेशन निर्माण प्रक्रिया में जितनी जल्दी हो सके। यदि इस व्यवहार को अधिक उपयोगकर्ताओं द्वारा रिपोर्ट किया जाता है तो मैं इस पर पुनर्विचार कर सकता हूं। –

+0

@ केविन गौडिन - मुझे यह त्रुटि भी मिली है – auval

+5

@ केविन गौडिन - मैंने सुपर.ऑनक्रेट() के बाद इनिट के साथ Acra की कोशिश की है, और अभी भी "ACRA # init को एक से अधिक बार बुलाया जाता है" समय-समय पर त्रुटि – auval

6

मैं इसे जंगली में ACRA 4.4.0 के साथ भी देख रहा हूं।

शायद इनिट विधि के तहत इस तरह के रूप में कुछ आसान है?

if (mApplication != null) { 
    throw new IllegalStateException("ACRA#init called more than once"); 
    //(return or finish or gracefully exit somehow)  
} else { 
    mApplication = app; 
    //and then continue with rest of acra init... 

संपादित करें: यह करने के लिए 12/27/12 के रूप में एक का पालन करें अप, ऐसा लगता है केविन की तरह इन परिवर्तनों को अपनाया है। विवरण यहां हैं: https://github.com/ACRA/acra/commit/cda06f5b803a09e9e7cc7dafae2c65c8fa69b861

19

मुझे लगता है कि आपके आवेदन में अतिरिक्त प्रक्रिया है। यही कारण है कि Application.onCreate को एक से अधिक बार बुलाया जाता है। अपनी मेनिफेस्ट फ़ाइल में देखें और गतिविधि या सेवा को एंड्रॉइड जैसे कुछ ढूंढने का प्रयास करें: प्रक्रिया =। इसका मतलब है कि गतिविधि/सेवा दूसरे दलविक वीएम में शुरू हो रही है, और यही कारण है कि एक और आवेदन उदाहरण बनाया गया है।

+1

यह मेरा मामला था। –