Android 如何正确扩展和使用应用程序
在我的应用程序中,我必须在活动之间共享各种JavaBeans类 为了做到这一点,我扩展了应用程序类,在其中我创建了一个包含所有JavaBean的HashMap。每个javabean都有自己的密钥 示例代码:Android 如何正确扩展和使用应用程序,android,global-variables,Android,Global Variables,在我的应用程序中,我必须在活动之间共享各种JavaBeans类 为了做到这一点,我扩展了应用程序类,在其中我创建了一个包含所有JavaBean的HashMap。每个javabean都有自己的密钥 示例代码: public class MyApplication extends Application { public static final String CLASSROOM_KEY = "Classroom"; private HashMap<String, Obje
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;
}
}
公共类MyApplication扩展应用程序{
公共静态最终字符串“教室”\u KEY=“教室”;
私有HashMap对象;
@凌驾
public void onCreate(){
myObjects=newhashmap();
myObjects.put(教室键,新教室());
}
公共HashMap getMyObjects(){
返回对象;
}
}
这在所有活动中都是可用的,这是可以的。但是,我有两个问题:
1) 我还需要在非活动类(如UTIL类)中获取MyObjet,但在这些类中,我无法执行“getApplicationContext()”,因为它们不扩展活动
例如,从我的主活动启动一个服务(但它在一个普通类中),该服务调用一个查询,而该查询又在另一个普通类中
查询需要MyObject中的对象
我想我不能公开我的对象
2) 在MyApplication中,我必须提前创建所有java bean
如果将来我想在现有的教室对象之外创建一个新的教室对象,该怎么办?
我应该为它创建一个新的密钥,但这是不可能的
谢谢你的帮助
乌德帕特
我改变问题:
在本课程中:
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());
}
}
});
}
公共类ClassroomUtils{
私有静态字符串结果=null;
私有静态字符串studentObjectID=null;
公共静态无效queryClassroom(字符串UUID,最终课堂){
ParseQuery=ParseQuery.getQuery(“教室”);
查询:whereEqualTo(“BeaconUUID”,UUID);
getFirstInBackground(新的GetCallback(){
公共无效完成(ParseObject对象,parsee异常){
如果(e==null){
试一试{
结果=object.getString(“标签”);
}捕获(异常e1){
System.out.println(“Vuota”);
}
如果(结果!=null){
Log.i(“课堂”、“检索”+结果);
设置教室(结果);
发送通知(结果);
addStudentClassroomRelation(对象);
}
}否则{
Log.e(“教室”,“错误:+e.getMessage());
}
}
});
}
我希望避免将课堂传递给此方法(从另一个普通类调用)。如何从该类访问全局对象
我想我不能公开我的对象
为什么不呢?myObjects
已经是有效的全局范围。从内存管理的角度来看,让myObjects
成为Application
的private
数据成员是没有什么好处的。如果你想成为教室
的一员,那就这么做吧。你只需要在工作时注意你的内存管理请使用您当前的实现
在MyApplication中,我必须提前创建所有java bean
不,你没有
如果将来我想在现有的教室对象之外创建一个新的教室对象,该怎么办
然后再创建另一个。可能正确的单例是一个学校
,它拥有一组教室
对象。同样,近期的主要问题是内存管理,因此您不会耗尽内存,因为您一直试图保持这些对象
1) 我还需要在非活动类(如UTIL类)中获取MyObjet,但在这些类中,我无法执行“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;
}
}
您需要对Java和Android进行一些研究。您似乎对Android系统一无所知,一些教程将进一步帮助您了解如何工作。例如,您可以简单地创建一个包含所有这些对象的
singleton
类,这意味着您不需要应用程序上下文-->从这次讨论来看,singleton似乎不被推荐。他也不推荐。我发现这并不重要,这取决于开发人员。我认为您不应该对应用程序类进行实例分析……这可以只是一个独立的singleton,不附加到应用程序类。是的,但是当您想做一些您需要这可能是一个简单的解决方案。我可以将其用作部分解决方案,因为在Android中这样做似乎非常…错误!如果你提到这一点,他们所说的是,你不应该使用单例,因为你不知道它们是否受应用程序生命周期的影响。我的方法不受影响他的,因为我们只持有对以前由系统创建的MyApplication实例的引用。并且您可以确定这个实例存在,从内存管理的角度来说,它是不存在的,但是..这似乎是一个“违规”我必须提前创建我的所有对象,因为在某些活动中创建它们,然后通过意图传递它们是不正确的。这将变得非常…难以处理!@user3075478:“这似乎是对OO范式imho的“违反”-不只是你现有的实现。或者是麻烦的来源。在许多文章中推荐使用这个方法来共享对象,但是他们不考虑正常的类。
public class CFoo{
public CFoo(){
//retrieve myObjects from MyApplication
MyApplication.getInstance().getMyObjects();
}
}