2012-10-09 24 views
10

ho sovraccaricato la classe Application nella mia app Android e sto utilizzando il sistema di report ACRA. mia app assomiglia (real source code here):Metodo classe applicazione Android onCreate chiamato più volte

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

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

E per quanto ne so, l'oggetto Application deve essere creato solo una volta, in modo che il metodo di onCreate dovrebbe essere chiamato solo una volta. Il problema è che nei miei rapporti crash (da ACRA) ho questo:

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) 

Così sembra che l'applicazione onCreate viene chiamato più volte, qualche idea su questo?

NOTE:

  • Nel mio xml Android manifesti, ho fatto NON utilizzare il Android: processo = attributo "stringa".
  • Sì, sono sicuro che nei miei routine di inizializzazione io sono non accidentalmente chiamando MyApplication.onCreate.
+3

Non sto parlando di Activity.onCreate (che viene normalmente chiamato ogni volta che si verifica una modifica della configurazione), ma Application.onCreate! –

+0

Hai provato a impostare un punto di interruzione qui? – CommonsWare

+0

è qualcosa che non riesco a riprodurre sul mio dispositivo, vedo solo questo dai rapporti ACRA ... se vi interrompo o metto un Log.d, onCreate viene chiamato una sola volta sia sul mio smartphone che sul mio tablet. –

risposta

6

Se si guarda la traccia dello stack, sembra che chiami makeApplication. Sospetto che ci sia una sorta di codice per verificare se l'applicazione è già stata creata e in caso contrario, crearla e che è causata dalla tua chiamata ACRA.init prima del super.onCreate. Generalmente quando si sostituiscono i metodi onCreate (sia Application o Activity), si consiglia di chiamare super.onCreate come prima riga della propria implementazione e successivamente fare le cose personalizzate. Darei un colpo e vedere se risolve le cose.

+0

Questa potrebbe essere una spiegazione. Ho documentato ACRA con un init prima di super.onCreate() per consentire ad ACRA di segnalare eccezioni che si verifichino il prima possibile nel processo di creazione dell'applicazione. Potrei riconsiderare questo se questo comportamento è segnalato da più utenti. –

+0

@Kevin Gaudin - Ho anche questo errore – auval

+5

@KevinGaudin - Ho provato Acra con init dopo super.onCreate(), e ancora ottengo "ACRA # init chiamato più di una volta" errore di volta in volta – auval

6

Lo vedo anche con ACRA 4.4.0 in natura.

Forse qualcosa di così semplice con il metodo init?

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... 

Modifica: 27/12/12 A seguito di questo, sembra che Kevin abbia adottato questi cambiamenti. I dettagli sono qui: https://github.com/ACRA/acra/commit/cda06f5b803a09e9e7cc7dafae2c65c8fa69b861

19

Penso che tu abbia un ulteriore processo nella tua applicazione. Questo è il motivo per cui Application.onCreate viene chiamato più di una volta. Cerca nel file manifest e prova a trovare l'attività o il servizio con qualcosa come android: process =. Ciò significa che attività/servizio inizia a partire dal secondo Dalvik VM ed è per questo che viene creata un'altra istanza dell'applicazione.

+1

Questo era il mio caso. –

Problemi correlati