2013-03-10 117 views
0

我的应用程序有调用MainActivity和它的一个成员的活动类使用Activity类的静态成员是在后台服务

public static SharedPreferences prefsdefault; 

我的应用还运行在背景上的服务(在另一个处理)。在我写的服务里面

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

该应用程序有时会在此行抛出空指针异常。为什么?这意味着当我关闭该活动并且无法在任何时候访问它(当我的服务运行时)时,垃圾收集器清理此成员?那么对此的完美解决方案是什么?

我应该将MainActiviy.class传递给服务吗?当我实现一个需要上下文的线程时也会发生这种情况。

回答

1

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

在这种情况下,您的服务将找到该字段为空。在活动中使用静态字段出于一系列原因是错误的,最重要的是您的应用程序可能会被操作系统终止并重新启动,并且之后所有静态字段都会被再次清除。

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

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

+0

我不明白“消灭”这个词,如果我在我的活动中有static boolean x = true,并且它在应用程序中设置为false。现在,如果操作系统重新启动我的应用程序,x会是True还是False? – yasserbn 2013-03-10 18:42:32

+0

这是真的。出于同样的原因,如果你有一个对象初始化的地方,如果os需要你的应用程序的资源,指向该对象的指针变为null。 – fedepaol 2013-03-10 18:44:15

+0

这是我应该避免在Activity中使用静态字段的原因吗?现在,如果我想调用(从我的活动)一个线程,需要在活动中声明的对象的信息?那么解决方案是什么?将MainActivity.class传递给Thread构造函数?也许? – yasserbn 2013-03-10 18:50:54

0

因为prefsdefaultNULL。我没有看到它被初始化。 你可以做到这一点的

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

热点提示:不要让你的SharedPreference实例静态

+0

线程需要的上下文等其他对象如何播放声音?将MainActivity传递给构造函数?这是完美的想法吗? – yasserbn 2013-03-10 18:34:25

+0

@yasserbn很难说没有看到更多的代码,这真的取决于;但不要使SharedPreference静态。 – poitroae 2013-03-10 18:40:45

0

这样做的原因是SharedPreferences将不会被初始化ü不需要做这样的SharedPreferences是全球可用的应用程序,如果模式为专用刚刚创造服务新的实例,以及它的工作