我遇到了一个问题:我想在几个活动和一个服务中使用静态对象(在额外的过程中)。不幸的是,服务没有从活动中获取对象,反之亦然。 我尝试简化代码示例中我认为的问题:
活动“主要”:
public static myObject o1;
public static myObject o2;
public void onCreate(Bundle savedInstanceState) {
o1 = new myObject("someParameter");
}
服务“myService”:
private myObject o1;
private myObject o2;
public void onCreate() {
this.o1 = main.o1;
this.o2 = main.o2;
this.o2 = new myObject("someOtherParameter");
}
现在的问题是:对于主要活动(以及所有其他活动),o2始终为空(尽管使用服务设置)。 对于服务o1始终为null(虽然在main中设置):( 但如果我正确地理解了Java-Objects,那么应该不是这样的,我是对的吗?
可能存在问题的任何想法?
答案 0 :(得分:0)
你可以从服务类添加修饰符static到o1,o2,但你可以直接使用main中的那些为什么要复制?在android中使用静态对象有助于缓存,并且最好将它们保存在一个类
中答案 1 :(得分:0)
这是失败的原因是因为您将this.o2
设置为对象的新引用。在这个程序中,你有四个引用和两个对象。
main.o1 -> OBJECT1
main.o2 -> NULL
在节目开始时。
在线this.o2 = main.o2
,您将this.o2
设置为对main.o2
的引用。所以现在你有了:
this.o2 -> main.o2 -> NULL
在线this.o2 = new myObject("Something");
上,this.o2
现在正在引用一个新对象。这给你:
this.o2 -> OBJECT2
main.o2 -> NULL
将最后一行更改为main.o2 -> new myObject("Something");
您将获得:
this.o2 -> main.o2 -> OBJECT2
请注意,这都是错误的编码习惯。您永远不想从类中更改静态变量。此外,在Android中,您通常不希望像这样直接访问活动的调用。
答案 2 :(得分:0)
正如DeeV所说,使用静态这种方式并不是很好的做法,但是如果你绝对必须这样做,那么将它们放在你的Application类中会在某种程度上包含这些混乱。
从Context派生的类(例如Service和Activity)支持getApplication()或getApplicationContext()方法,您必须将其转换为应用程序类才能访问变量。
public class MyApplication extends Application {
public static myObject o1;
public static myObject o2;
}
public class MyActivity extends Activity {
public void onCreate(Bundle state) {
myObject o1 = ((MyApplication) getApplication()).o1;
}
}
public class MyService extends Service {
public void onCreate(Bundle state) {
myObject o2 = ((MyApplication) getApplication()).o2;
}
}
请记住,您必须同步访问来自不同线程的变量。
答案 3 :(得分:0)
问题不在于Java,而在于Android。 Android不允许您访问其他进程的变量。只需从清单文件中的服务中删除android:process属性,以便服务在运行活动的同一过程中运行。