2012-10-10 22 views
8

Tengo la siguiente clase de aplicación para mi aplicación. Cuando se inicia la aplicación, deseo obtener algunas configuraciones de las preferencias e iniciar un servicio en segundo plano.¿Condición de carrera entre la aplicación onCreate y los recursos cargados?

public class MyApplication extends Application { 

    public void onCreate() { 
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
      String key = getResources().getString(R.string.prefkey_updateinterval); 
      ... 
    } 

Esto normalmente funciona bien, pero de vez en cuando se inicia mi programa de Eclipse "Ejecutar" me sale este error:

10-10 08:25:47.016: E/AndroidRuntime(26402): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7f0a0004 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.content.res.Resources.getText(Resources.java:216) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.content.res.Resources.getString(Resources.java:269) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at com.karwosts.MyApp.PortfolioStore.onCreate(PortfolioStore.java:40) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3395) 

Este id es de mi R.java:

public static final int prefkey_updateinterval=0x7f0a0004; 

Dado que esto funciona bien la mayor parte del tiempo, tengo que asumir que hay algún tipo de condición de carrera entre onCreate y los recursos que se están cargando.

Si ese es el caso, ¿se recomienda no leer recursos en Application onCreate?

En caso afirmativo, ¿hay un lugar mejor para inicializar un servicio cuando se inicia la aplicación?

+0

Siempre puede inicializar el 'Servicio' en la' Actividad' principal de su aplicación ... esto evita la necesidad de subclasificar 'Aplicación'. –

Respuesta

6

Since this works fine most of the time, I have to assume that there is some kind of race condition between onCreate and the resources being loaded?

Si el mismo archivo APK - sin recompilación, sin reinstalación, etc. - no genera constantemente el error, entonces podría ser algún tipo de condición de carrera, sin embargo, que me sorprendería.

Si el archivo APK misma falla constantemente, entonces esta es una más variedad de jardín recursos fuera de sincronización con-los-demás-de-la-código de problema, y ​​la limpieza del proyecto desactivarla arriba.

is there a better place to initialize a service when application launches?

en mi humilde opinión, el número de aplicaciones que necesitan "inicializar un servicio cuando la aplicación lanza" es extremadamente baja, hasta el punto en que no puedo pensar en un escenario fruto de la casualidad que esto sería un buen plan. Eso no quiere decir que no tengas ese escenario, pero es un olor de código serio en mi libro sin una explicación.

+0

No creo * es un problema fuera de sincronización, aunque supongo que no puedo garantizarlo en este momento. En el caso de que falle, presiono 'Ejecutar -> Bloquear -> Ejecutar -> (se abre con éxito)', sin tocar el proyecto. Además, no he cambiado ninguno de mis recursos últimamente y, en general, solo veo un problema de sincronización cuando cambio activamente los recursos. La próxima vez que suceda intentaré simplemente volver a ejecutar la misma APK desde el dispositivo para estar seguro. – Tim

1

He notado que en los casos en que se usan muchos recursos (y se generan en R.java), limpiar la aplicación antes de ejecutar soluciona estos problemas. Así que supongo que esto no es una condición de carrera, sino un problema con Eclipse o el SDK de Android sin recursos refrescantes. En cuanto a la ubicación del código, es tan bueno como cualquier otra opción, en mi opinión.

Cuestiones relacionadas