8

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

public class MyApplication extends Application {

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

这通常工作正常,但偶尔从 eclipse“运行”启动我的程序时,我会收到此错误:

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中读取资源?

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

4

2 回答 2

6

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

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

如果同一个APK 文件一直失败,那么这是一个更常见的资源与代码剩余部分不同步的问题,清理项目将清除它。

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

恕我直言,需要“在应用程序启动时初始化服务”的应用程序数量极少,以至于我无法想到一个好的计划。这并不是说您没有这种情况,但在我的书中这是一种严重的代码异味,没有任何解释。

于 2012-10-10T15:51:52.390 回答
1

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

于 2012-10-10T15:58:54.407 回答