2012-10-10 3 views
8

Ich habe die folgende Anwendungsklasse für meine App. Wenn die Anwendung gestartet wird, möchte ich einige Einstellungen aus den Einstellungen abrufen und einen Hintergrunddienst starten.Race-Bedingung zwischen Application onCreate und Ressourcen geladen?

public class MyApplication extends Application { 

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

Diese Regel funktioniert gut, aber gelegentlich, wenn mein Programm von Eclipse "Run" starten bekomme ich diesen Fehler:

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) 

Diese ID von meinem R.java ist:

public static final int prefkey_updateinterval=0x7f0a0004; 

Da dies die meiste Zeit funktioniert, muss ich davon ausgehen, dass zwischen onCreate und den geladenen Ressourcen eine Art Race-Bedingung besteht.

Wenn das der Fall ist, wird empfohlen, Ressourcen in der Anwendung onCreate nicht zu lesen?

Wenn ja, gibt es einen besseren Ort, um einen Dienst zu initialisieren, wenn die Anwendung gestartet wird?

+0

Sie können den 'Service' immer nur in der Hauptaktivität Ihrer App initialisieren ... dies vermeidet die Notwendigkeit der Unterklasse' Application'. –

Antwort

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?

Wenn die gleiche APK-Datei - nicht neu kompilieren, keine Neuinstallation usw. - nicht konsequent die Fehler erzeugt, dann könnte es eine Art Race-Bedingung sein, obwohl das mir überraschen würde.

Wenn die gleiche APK-Datei nicht konsequent, dann ist dies eine mehr Garten-Sorte Ressourcen-out-of-sync-with-the-rest-of-the-Code Problem, und das Projektes Reinigung wird es klar oben.

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

IMHO, die Anzahl der Anwendungen, die auf „einen Dienst initialisieren, wenn die Anwendung startet“ müssen extrem niedrig ist, bis zu dem Punkt, wo ich nicht von einem Szenario aus dem Stehgreif denken kann, wo dies ein guter Plan sein würde. Das soll nicht heißen, dass Sie kein solches Szenario haben, aber es ist ein ernsthafter Code-Geruch in meinem Buch ohne eine Erklärung.

+0

Ich denke nicht * es ist ein Problem, das nicht synchron ist, obwohl ich es im Moment nicht garantieren kann. Im Falle, dass es fehlschlägt, drücke ich einfach "Run -> Crash -> Run -> (öffnet erfolgreich)", ohne das Projekt zu berühren. Außerdem habe ich in letzter Zeit keine meiner Ressourcen geändert, und im Allgemeinen sehe ich nur Probleme mit der Synchronisierung, wenn ich die Ressourcen aktiv ändere. Nächstes Mal werde ich versuchen, die gleiche APK vom Gerät selbst erneut auszuführen, um sicher zu sein. – Tim

1

Ich habe festgestellt, dass in Fällen, in denen viele Ressourcen verwendet (und in R.java erzeugt), die Anwendung vor der Ausführung bereinigt wird, um diese Probleme zu beheben. Ich würde also annehmen, dass dies keine Race Condition ist - aber ein Problem mit Eclipse oder dem Android SDK mit nicht erfrischenden Ressourcen. Was die Platzierung des Codes angeht - es ist meiner Meinung nach so gut wie jede andere Option.

Verwandte Themen