2012-10-10 9 views
8

私のアプリケーションには次のアプリケーションクラスがあります。アプリケーションが起動すると、設定からいくつかの設定を取得し、バックグラウンドサービスを開始したいと考えています。アプリケーション作成時とリソース読み込み時の競合状態ですか?

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とロードされるリソースの間にある種の競合状態が存在すると仮定しなければなりません。

この場合、アプリケーション作成時にリソースを読み込まないことをお勧めしますか?

もしそうなら、アプリケーションの起動時にサービスを初期化する場所がありますか?いいえ再コンパイルなし再インストールなど - - 同じ APKファイルが場合

+0

あなたのアプリケーションの主な 'Activity'の' Service'をいつでも初期化することができます。これは '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ファイルが一貫して失敗すると、このコードは、コードの残りの部分で同期していない、よりガーデンに富んだリソースであり、プロジェクトをクリーンアップするとクリアされますアップ。

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

IMHO、「アプリケーションの起動時にサービスを初期化」する必要があるアプリの数は、私は、これは良い計画になるカフオフシナリオを考えることができない点まで、非常に低いです。それはあなたがそのようなシナリオを持っていないと言っているわけではありませんが、私の本で深刻なコードの臭いです。

+0

私はそれが現時点では保証できないと思うが、それは同期外の問題ではないと思う。失敗した場合は、プロジェクトに触れることなく 'Run - > Crash - > Run - >(正常に開く)'を押すだけです。また、私は最近、私のリソースを変更していないし、一般的に私はリソースを積極的に変更しているときに同期の問題を参照してください。次回は、同じAPKをデバイス自体から再試行して確認します。 – Tim

1

多くのリソースが使用され(R.javaで生成される)、実行前にアプリケーションをクリーンアップすると、これらの問題が修正されています。ですから、私はこれが競合状態ではないと考えていますが、EclipseやAndroid SDKの問題で、リソースをリフレッシュしないとします。コードの配置に関しては、私の意見では他のオプションと同じくらい良いです。

関連する問題