在我的应用程序中,我必须在活动中分享各种Java-Beans类。
为了做到这一点,我扩展了应用程序类,其中我创建了一个装有所有Java-Beans的标签。每个Java-Beans都有自己的钥匙。
示例代码:
public class MyApplication extends Application {
public static final String CLASSROOM_KEY = "Classroom";
private HashMap<String, Object> myObjects;
@Override
public void onCreate() {
myObjects = new HashMap<String, Object>();
myObjects.put(CLASSROOM_KEY, new Classroom());
}
public HashMap<String, Object> getMyObjects() {
return myObjects;
}
}
这在所有活动中都是可用的,这是可以的。但是,我有两个问题:
1)我还需要在非活动类中(例如Utils类)中获得myobjets,但是在这些类中,我无法进行" getApplicationContext()",因为它们不会扩展活动。
例如,从我的主要活动中,我开始服务(但它在正常类中),并且该服务调用查询又是在另一个普通类中。
查询需要一个MyObjects中的对象!
我认为我无法使myObjects公开静态。
2)在myapplication中,我必须提前创建所有我的Java beans。
如果将来我想创建一个新的教室对象,除了已经存在的对象外,该怎么办?我应该为此创建一个新键,但这是不可能的!
感谢您的帮助。
udpate
我更改了问题:
在此类中:
public class ClassroomUtils {
private static String result = null;
private static String studentObjectID = null;
public static void queryClassroom(String UUID, final Classroom classroom) {
ParseQuery<ParseObject> query = ParseQuery.getQuery("Classroom");
query.whereEqualTo("BeaconUUID", UUID);
query.getFirstInBackground(new GetCallback<ParseObject>() {
public void done(ParseObject object, ParseException e) {
if (e == null) {
try {
result = object.getString("Label");
} catch(Exception e1){
System.out.println("Vuota");
}
if(result != null) {
Log.i("Classroom", "Retrieved " + result );
classroom.setClassroom(result);
sendNotification(result);
addStudentClassroomRelation(object);
}
} else {
Log.e("Classroom", "Error: " + e.getMessage());
}
}
});
}
我想避免将教室传递到此方法(从另一个普通类调用)。如何从此类访问全局对象?
我认为我无法使myObjects公开静态。
为什么不呢?myObjects
在范围上已经有效地全局。从内存管理的角度来看,没有myObjects
是Application
的private
数据成员,从而没有什么可获得的。如果您希望Classroom
成为Java Singleton,请这样做。您只需要像当前的实现一样观看内存管理。
在myapplication中,我必须提前创建所有我的Java-Beans
不,你不。
如果将来我想创建一个新的教室对象,除了已经存在的课堂对象怎么办?
然后创建另一个。也许正确的单例是School
,它可以包含在Classroom
对象的集合上。同样,您的主要近期问题是内存管理之一,因此您不会耗尽内存,因为您一直试图将这些对象保留在所有时间周围。
我认为,1)我还需要在非活动类中(例如Utils类)中获得myobjets,但是在这些类中,我无法进行" getApplicationContext()",因为它们不会扩展活动。
最好的方法是将MyApplication类创建为单身人士。您可以通过调用GetInstance和属性的相应Getter/Setter从任何地方检索数据。
简短示例:
public class MyApplication extends Application {
private static MyApplication mInstance;
public MyApplication getInstance(){
// this means you have only one existing instance of this class.
if(mInstance == null){
// set the context to this MyApplication instance
mInstance = this;
}
// return the instance of this class
return mInstance;
}
// here your stuff for MyApplication
public HashMap<String, Object> getMyObjects() {
return myObjects;
}
}
然后,您可以从其他类别中调用它:
public class CFoo{
public CFoo(){
//retrieve myObjects from MyApplication
MyApplication.getInstance().getMyObjects();
}
}