8

アプリには次のアプリケーション クラスがあります。アプリケーションの起動時に、設定からいくつかの設定を取得して、バックグラウンド サービスを開始したいと考えています。

public class MyApplication extends Application {

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

This normally works fine, but occasionally when starting my program from eclipse "Run" I get this 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)

This id is from my R.java:

public static final int prefkey_updateinterval=0x7f0a0004;

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?

If that's the case, is it recommended not to read resources in Application onCreate?

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

4

2 に答える 2

6

ほとんどの場合これで問題なく動作するため、onCreate と読み込まれるリソースとの間にある種の競合状態があると想定する必要があります。

同じAPK ファイル (再コンパイルなし、再インストールなしなど) で一貫してエラーが生成されない場合は、ある種の競合状態である可能性がありますが、それには驚かされます。

同じAPK ファイルが一貫して失敗する場合、これはさまざまなリソースがコードの残りの部分と同期していない問題であり、プロジェクトをクリーンアップすると解決します。

アプリケーションの起動時にサービスを初期化するためのより良い場所はありますか?

IMHO、「アプリケーションの起動時にサービスを初期化する」必要があるアプリの数は非常に少なく、これが良い計画になるシナリオをすぐには思いつかないほどです。そのようなシナリオがないと言っているわけではありませんが、説明のない私の本では深刻なコード臭です。

于 2012-10-10T15:51:52.390 に答える
1

多くのリソースが使用されている (および R.java で生成されている) 場合、実行前にアプリケーションをクリーンアップすると、これらの問題が修正されることに気付きました。したがって、これは競合状態ではなく、リソースを更新しない Eclipse または Android SDK の問題だと思います。コードの配置に関しては、私の意見では、他のオプションと同じくらい良いです。

于 2012-10-10T15:58:54.407 に答える