2012-10-09 15 views
10

Ich habe die Anwendung Klasse in meiner Android App überlastet und ich verwende das ACRA Berichtssystem. Meine app aussieht (real source code here):Android Application Klassenmethode onCreate wird mehrmals aufgerufen

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

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

Und soweit ich weiß, sollte das Anwendungsobjekt nur einmal erstellt werden, so dass die onCreate Methode sollte nur einmal aufgerufen werden. Das Problem ist, dass in meinen Crash-Berichten (von ACRA) i diese:

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) 

So scheint es, wie die App onCreate mehrmals aufgerufen wird, jede Idee dazu?

NOTES:

  • In meiner Android-XML-Manifest, das habe ich nicht das Android verwenden: process = "string" Attribut.
  • Ja, ich bin sicher,, dass ich in meinen Initialisierungsroutinen nicht versehentlich Aufruf MyApplication.onCreate bin.
+3

Ich spreche nicht über Activity.onCreate (die normalerweise jedes Mal aufgerufen wird, wenn eine Konfigurationsänderung auftritt), aber Application.onCreate! –

+0

Haben Sie versucht, hier einen Haltepunkt zu setzen? – CommonsWare

+0

es ist etwas, was ich nicht auf meinem Gerät reproduzieren kann, ich sehe es nur aus den Berichten von ACRA ... Wenn ich dort brich oder ein Log.d, onCreate wird nur einmal auf meinem Smartphone und Tablet aufgerufen. –

Antwort

6

Wenn Sie auf die Stack-Trace schauen, sieht es aus wie ACRA.init ruft makeApplication. Ich vermute, dass es eine Art von Code gibt, um zu überprüfen, ob die Anwendung bereits erstellt wurde und wenn nicht, erstellen Sie sie und dass es durch Ihren Aufruf ACRA.init vor verursacht wird. Im Allgemeinen, wenn onCreate Methoden überschrieben werden (ob Application oder Activity), wird empfohlen, super.onCreate als die erste Zeile Ihrer Implementierung zu nennen und danach Ihre benutzerdefinierten Sachen zu tun. Ich würde es versuchen und sehen, ob es die Dinge repariert.

+0

Das könnte eine Erklärung sein. Ich habe ACRA mit einem init vor super dokumentiert.onCreate(), damit ACRA Ausnahmen melden kann, die so schnell wie möglich beim Erstellen der Anwendung auftreten. Ich könnte dies überprüfen, wenn dieses Verhalten von mehr Benutzern gemeldet wird. –

+0

@Kevin Gaudin - Ich habe diesen Fehler auch – auval

+5

@KevinGaudin - Ich habe Acra mit init nach super.onCreate() versucht, und immer noch "ACRA # init mehr als einmal aufgerufen" -Fehler von Zeit zu Zeit – auval

19

Ich denke, dass Sie zusätzliche Prozess in Ihrer Anwendung haben. Aus diesem Grund wird Application.onCreate mehrmals aufgerufen. Schauen Sie in Ihre Manifestdatei und versuchen Sie, die Aktivität oder den Dienst mit etwas wie android: process = zu finden. Dies bedeutet, dass die Aktivität/der Dienst in der zweiten Dalvik-VM gestartet wird. Daher wird eine andere Anwendungsinstanz erstellt.

+1

Das war mein Fall. –

Verwandte Themen