Application onCreate和资源加载之间的竞争条件?

时间:2012-10-10 15:43:47

标签: android

我的应用程序有以下应用程序类。当应用程序启动时,我想从首选项中获取一些设置并启动后台服务。

public class MyApplication extends Application {

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

这通常可以正常工作,但偶尔从eclipse“Run”启动我的程序时出现此错误:

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和正在加载的资源之间存在某种竞争条件?

如果是这种情况,是否建议不要在Application onCreate中读取资源?

如果是这样,在应用程序启动时是否有更好的地方初始化服务?

2 个答案:

答案 0 :(得分:6)

  

由于这在大多数情况下工作正常,我必须假设onCreate和正在加载的资源之间存在某种竞争条件?

如果相同的 APK文件 - 没有重新编译,没有重新安装等 - 不能始终如一地生成错误,那么它可能是某种竞争条件,尽管这会让我感到惊讶。

如果相同的 APK文件一直失败,那么这是一个更多花园种类的资源 - 与代码其余部分不同步的问题,并清理项目将清理它。

  

是否有更好的地方在应用程序启动时初始化服务?

恕我直言,需要“在应用程序启动时初始化服务”的应用程序数量非常少,我无法想到袖口上的情况,这将是一个很好的计划。这并不是说你没有这样的场景,但在我的书中却没有任何解释,这是一个严重的代码味道。

答案 1 :(得分:1)

我注意到在使用大量资源(并在R.java中生成)的情况下,在运行之前清理应用程序会修复这些问题。所以我认为这不是竞争条件 - 但Eclipse或Android SDK的问题并没有令人耳目一新的资源。至于代码的位置 - 在我看来,它和其他任何选项一样好。

相关问题