0

My app has an Activity class called MainActivity and one of its members is

public static SharedPreferences prefsdefault;

My app has also a service (in another process) which runs in background. Inside the service I wrote

MainActivity.prefsdefault.getString(Key,"Hello");

The app sometimes throws null pointer exception at this line. Why? Does it mean that this member is cleaned up by the garbage collector when I close the activity and I cannot access it at anytime (when my service runs)? So what is the perfect solution for this?

Should I pass the MainActiviy.class to the service? It also happens when I implement a thread that requires a context.

4

3 回答 3

1

这是因为,即使您的 prefsdefault 可能已经初始化一次,您的整个应用程序也可能被垃圾收集并再次重新启动。

在这种情况下,您的服务会发现该字段为空。在活动中使用静态字段是错误的,原因有很多,最重要的是您的应用程序可能会被操作系统杀死并重新启动,然后所有静态字段都会再次被清除。

使用共享首选项的正确方法是在需要访问/写入时使用 getSharedPreferences 访问它们。

另一个奇怪的事情是你说服务在另一个进程中运行。在这种情况下,它不应该能够访问来自另一个进程的数据。

于 2013-03-10T18:34:14.353 回答
0

因为prefsdefaultNULL。我没有看到它已初始化。你可以这样做

prefsdefault = getSharedPreferences("my_preferences", Activity.MODE_PRIVATE);

热点提示:永远不要让你的SharedPreference实例static

于 2013-03-10T18:29:35.103 回答
0

这样做的原因SharedPreferences是没有初始化你不需要这样做,因为SharedPreferences如果 MODE 是私有的,在应用程序中全局可用,只需在服务中创建新实例,它就会工作

于 2013-03-10T18:29:39.930 回答