2012-10-10 12 views
8

Mam następujące klasy aplikacji dla mojej aplikacji. Po uruchomieniu aplikacji chcę pobrać ustawienia z preferencji i uruchomić usługę w tle.Wyścig między aplikacją onCreate i załadowanymi zasobami?

public class MyApplication extends Application { 

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

to normalnie działa dobrze, ale od czasu do czasu, gdy zaczyna swój program od Zaćmienie "Run" otrzymuję ten błąd:

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) 

Identyfikator ten jest z mojego R.java:

public static final int prefkey_updateinterval=0x7f0a0004; 

Ponieważ to działa dobrze przez większość czasu, muszę założyć, że istnieje jakiś rodzaj wyścigu pomiędzy onCreate i ładowanymi zasobami?

Czy w takim przypadku zaleca się, aby nie czytać zasobów w aplikacji onCreate?

Jeśli tak, czy istnieje lepsze miejsce do zainicjowania usługi po uruchomieniu aplikacji?

+0

Zawsze możesz po prostu zainicjować 'Service' w głównej aplikacji' Activity' ... dzięki temu unikniesz potrzeby podklasy "Application". –

Odpowiedz

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?

Jeśli sam plik APK - no przebudować, nie reinstall, itd. - nie konsekwentnie wygenerować błąd, to może być jakiś rodzaj wyścigu, mimo że mnie zaskoczyć.

Jeśli plik APK ulega ciągłemu niepowodzeniu, oznacza to, że jest to bardziej nietypowy zbiór zasobów, który nie jest zsynchronizowany z resztą kodu, a wyczyszczenie projektu spowoduje wyczyszczenie tego pliku. w górę.

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

IMHO, liczba aplikacji, które trzeba „zainicjować usługę kiedy aplikacja uruchamia” jest bardzo niska, do punktu, w którym nie mogę myśleć o scenariuszu off mankietu gdzie będzie to dobry plan. To nie znaczy, że nie masz takiego scenariusza, ale jest to poważny zapach kodu w mojej książce bez wyjaśnienia.

+0

Nie sądzę * że jest to problem niesynchronizowany, chociaż przypuszczam, że nie mogę tego zagwarantować w tej chwili. W przypadku niepowodzenia, po prostu wciskam 'Run -> Crash -> Run -> (otwiera się pomyślnie)', nie dotykając projektu. Ponadto nie zmieniłem ostatnio żadnego z moich zasobów i generalnie widzę problem braku synchronizacji tylko wtedy, gdy aktywnie zmieniam zasoby. Następnym razem spróbuję po prostu ponownie uruchomić ten sam plik APK z samego urządzenia, aby się upewnić. – Tim

1

Zauważyłem, że w przypadkach, gdy wiele zasobów jest używanych (i generowanych w R.java), czyszczenie aplikacji przed uruchomieniem rozwiązuje te problemy. Zakładam więc, że nie jest to sytuacja wyścigowa - ale problem z Eclipse lub Androidem SDK z nieodświeżającymi zasobami. Co do umieszczenia kodu - moim zdaniem jest tak samo dobry jak jakakolwiek inna opcja.

Powiązane problemy