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

时间:2015-05-12 18:03:18

标签: android global-variables

在我的应用程序中,我必须在活动中共享各种java-beans类。

为了做到这一点,我扩展了Application类,在其中我创建了一个填充了所有java-beans的HashMap。每个java-beans都有自己的Key。

示例代码:

C8

这在所有活动中都可以使用,这没关系。但是,我有两个问题:

1)我需要在非活动类中使用myObjets,比如utils类,但是在这些类中我不能做" getApplicationContext()"因为他们没有扩展活动。

例如,在我的主要活动中,我启动了一个服务(但它在普通的类中),并且该服务调用的查询又是另一个正常的类。

查询需要myObjects中的对象!

我认为我不能将myObjects设为公共静态。

2)在MyApplication中,我必须提前创建所有的java-bean。

如果将来我想创建一个新的教室对象,除了已经存在的教室对象,该怎么办? 我应该为它创建一个新密钥,但这是不可能的!

感谢您的帮助。

UDPATE

我改变了问题:

在这堂课中:

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

我想避免将教室传递给这种方法(从另一个普通班级调用)。如何从这个类访问全局对象?

2 个答案:

答案 0 :(得分:0)

  

我认为我无法使myObjects成为公共静态。

为什么不呢? myObjects已经实际上具有全球性。从内存管理的角度来看,让myObjects成为private的{​​{1}}数据成员,没有任何好处。如果您希望Application成为Java singleton,请执行此操作。您只需要观察内存管理,就像使用当前的实现一样。

  

在MyApplication中,我必须提前创建所有的java-beans

不,你没有。

  

如果将来我想创建一个新的教室对象,除了已经存在的教室对象,该怎么办?

然后创建另一个。也许正确的单例是Classroom,它保存在School个对象的集合上。同样,您的主要近期问题是内存管理问题,因此您不会耗尽内存,因为您一直试图保留这些对象。

答案 1 :(得分:0)

  

1)我需要在非活动类中使用myObjets,比如utils类,但是在这些类中我不能做&#34; getApplicationContext()&#34;因为他们没有扩展活动。

我认为最好的方法是将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();
    }
}