Android 如何正确扩展和使用应用程序

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

在我的应用程序中,我必须在活动之间共享各种JavaBeans类

为了做到这一点,我扩展了应用程序类,在其中我创建了一个包含所有JavaBean的HashMap。每个javabean都有自己的密钥

示例代码:

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();
    }
}