2012-10-10 35 views
8

我有我的應用程序的以下應用程序類。當應用程序啓動時,我想從首選項中獲取一些設置並啓動後臺服務。應用程序onCreate和資源加載之間的競爭條件?

public class MyApplication extends Application { 

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

這通常工作正常,但偶爾也會從月食 「運行」 開始我的計劃時,我得到這個錯誤:

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) 

此ID是從我的R.java:

public static final int prefkey_updateinterval=0x7f0a0004; 

因爲這工作得很好大部分的時間,我必須假定有某種的onCreate和資源之間的競爭條件加載?

如果是這樣的話,是建議不要在應用程序的onCreate閱讀資源?

如果是這樣,有沒有更好的地方來初始化服務應用程序啓動時?

+0

你總是可以只初始化'Service'在應用程序的主'Activity' ......這避免了需要繼承'Application'。 –

回答

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?

如果相同 APK文件 - 無需重新編譯,不重新安裝,等等 - 沒有始終如一地產生錯誤,那麼它可能是某種形式的競爭條件,儘管這讓我感到吃驚。

如果相同 APK文件一致失敗,那麼這是一個更具花園多樣性的資源不同步代碼的問題,清理項目將清除它向上。

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

恕我直言,這需要「時,應用程序啓動初始化服務」的應用程序的數量是非常低的,在那裏我想不出一個場景即興哪裏,這將是一個很好的計劃點。這並不是說你沒有這種情況,但是在我的書中沒有解釋,這是一種嚴重的代碼味道。

+0

我不認爲* *是出不同步的問題,但我想我不能在此刻保證。在失敗的情況下,我只需按下'運行 - >崩潰 - >運行 - >(成功打開)',而無需觸摸項目。此外,我最近並未更改任何資源,並且通常只在我主動更改資源時纔會看到不同步的問題。下次發生時,我會嘗試從設備本身重新運行相同的APK來確保。 – Tim

1

我注意到,在大量的資源被用於(在R.java生成)的情況下,清潔運行修復這些問題之前,該應用程序。所以我會認爲這不是一個競爭條件 - 但是Eclipse或Android SDK的問題不是刷新資源。至於代碼的位置 - 在我看來,它和其他選項一樣好。