2012-10-09 15 views
10

he sobrecargado la clase de aplicación en mi aplicación de Android y estoy usando el sistema de informe ACRA. Mi aplicación parece (real source code here):Método de clase de la aplicación Android onCreate siendo llamado varias veces

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

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

Y por lo que sé, el objeto de la solicitud se debe crear una sola vez, por lo que el método onCreate debe ser llamado una sola vez. El problema es que en mis informes de fallos (de ACRA) tengo este:

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) 

así que parece que la aplicación onCreate se llama varias veces, alguna idea sobre esto?

NOTAS:

  • en mi xml androide de manifiesto, lo hice NO utilice el androide: Proceso = atributo "cadena".
  • Sí, Estoy seguro de que en mis rutinas de inicialización estoy no accidentalmente llamando MyApplication.onCreate.
+3

No estoy hablando de Activity.onCreate (que normalmente se llama cada vez que se produce un cambio de configuración), sino Application.onCreate! –

+0

¿Has intentado establecer un punto de interrupción aquí? – CommonsWare

+0

es algo que no puedo reproducir en mi dispositivo, solo lo veo en los informes de ACRA ... si rompo allí o coloco un Log.d, onCreate solo se llama una vez tanto en mi teléfono inteligente como en mi tableta. –

Respuesta

6

Si observa el seguimiento de la pila, parece que ACRA.init llama al makeApplication. Sospecho que hay algún tipo de código para verificar si la aplicación ya se ha creado y, de no ser así, crearla y que es causada por su llamada al ACRA.init antes del super.onCreate. En general, al anular los métodos onCreate (ya sea Application o Activity), se recomienda llamar al super.onCreate como la primera línea de su implementación y luego realizar sus tareas personalizadas. Daría una oportunidad y vería si arregla las cosas.

+0

Eso podría ser una explicación. Documenté ACRA con un init antes de super.onCreate() para permitir que ACRA informe excepciones que sucederían lo antes posible en el proceso de creación de la aplicación. Podría reconsiderar esto si este comportamiento es informado por más usuarios. –

+0

@Kevin Gaudin - Tengo este error también – auval

+5

@KevinGaudin - He probado Acra con init después de super.onCreate(), y sigo recibiendo el error "ACRA # init llamado más de una vez" de vez en cuando – auval

6

También estoy viendo esto con ACRA 4.4.0 en estado salvaje.

Tal vez algo tan simple como esto bajo el método 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... 

Editar: 12/27/12 Como seguimiento de esto, parece que Kevin ha adoptado estos cambios. Los detalles están aquí: https://github.com/ACRA/acra/commit/cda06f5b803a09e9e7cc7dafae2c65c8fa69b861

19

Creo que tiene un proceso adicional en su aplicación. Es por eso que Application.onCreate se llama más de una vez. Mire en su archivo de manifiesto e intente encontrar la actividad o servicio con algo como android: process =. Esto significa que la actividad/servicio se inicia en la segunda VM de Dalvik, y es por eso que se crea otra instancia de aplicación.

+1

Este fue mi caso. –

Cuestiones relacionadas