Condición de carrera entre la aplicación onCreate y los recursos cargados?

Tengo la siguiente clase de aplicación para mi aplicación. Cuando se inicia la aplicación, quiero obtener algunos ajustes de las preferencias e iniciar un servicio de fondo.

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 al iniciar mi programa desde 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?

Si es así, ¿hay un mejor lugar para inicializar un servicio cuando se inicia la aplicación?

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 el mismo archivo APK – no recompilar, no reinstalar, etc – no siempre genera el error, entonces podría ser algún tipo de condición de carrera, aunque eso me sorprendería.

Si el mismo archivo APK falla de forma consistente, este es un problema más de variedad de jardinería-sin-sincronización con el resto del código, y la limpieza del proyecto lo aclarará.

¿Existe un mejor lugar para inicializar un servicio cuando se inicia la aplicación?

IMHO, el número de aplicaciones que necesitan "inicializar un servicio cuando se inicia la aplicación" es extremadamente bajo, hasta el punto de que no puedo pensar en un escenario fuera de la banda donde este sería un buen plan. Eso no quiere decir que no tengas tal escenario, pero es un grave olor a código en mi libro sin una explicación.

He notado que en los casos en que se utilizan muchos recursos (y se generan en R.java), la limpieza de la aplicación antes de ejecutar corrige estos problemas. Por lo tanto, supongo que esto no es una condición de carrera, sino un problema con Eclipse o el SDK de Android con recursos no renovadores. En cuanto a la colocación del código – es tan bueno como cualquier otra opción, en mi opinión.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.