我为我的应用程序提供了以下应用程序类。当应用程序启动时,我想从preferences中获取一些设置,并启动一个后台服务。
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和加载的资源之间存在某种竞争条件?
如果是这样的话,是否建议不要在应用程序onCreate中读取资源?
如果是这样的话,有没有更好的地方在应用程序启动时初始化服务?
发布于 2012-10-10 23:51:52
由于这在大多数情况下都工作得很好,我不得不假设在onCreate和加载的资源之间存在某种竞争条件?
如果相同的APK文件--没有重新编译、没有重新安装等等--没有一致地生成错误,那么它可能是某种竞争条件,尽管这会让我感到惊讶。
如果相同的APK文件总是失败,那么这是一个更普通的问题,清理项目会将其清理干净。
在应用程序启动时,有没有更好的地方来初始化服务?
我的意思是,需要“在应用程序启动时初始化服务”的应用程序数量非常少,以至于我想不出一个即兴的方案,这将是一个好的计划。这并不是说你没有这样的场景,但在我的书中,这是一个严重的代码气味,没有任何解释。
发布于 2012-10-10 23:58:54
我注意到,在使用(并在R.java中生成)大量资源的情况下,在运行之前清除应用程序可以修复这些问题。因此,我假设这不是竞争条件--而是Eclipse或Android SDK没有刷新资源的问题。至于代码的位置--在我看来,它和其他选择一样好。
https://stackoverflow.com/questions/12823300
复制相似问题