从高处访问全球数据的解决方案 - 高效

时间:2011-11-27 13:43:59

标签: android global-variables

我需要找到一个解决方案来保存和访问大量复杂的全局数据和方法。它必须可以从各种数据类的活动和普通实例变量中访问。

我就是这样做的。我想知道它是否有任何问题,或者是否有更好/更清洁的方式。

首先,我推荐多次推荐Application ......

public class MainDataManager extends Application{

   public ... large chunks of data in arrays, lists, sets,....

   //static variable for singleton access from within instance variables of other classes
   public static MainDataManager mainDataManager;

  //create and init the global data, and store it in the static variable of the class
  @Override
      public void onCreate() {
        super.onCreate();
        //in case it should get called more than once for any reason
        if (mainDataManager == null) {
            init();
            mainDataManager = this;
            }
      }

现在从推荐的各种活动中访问它......

MainDataManager mainDataManager = (MainDataManager)getApplicationContext();

因为我需要从正常的数据类实例中访问它......

public class MyDataClass {
    public MainDataManager mainDataManager;
    public String name;

    public MyDataClass(String namex) {
        this.name = namex;
        //this is why I defined the static variable within MainDataManager, so
        //one has access to it from within the instance of MyDataClass
        this.mainDataManager = MainDataManager.mainDataManager;
    }

      public void examplesForAccessing() {
      //some examples on how to access the global data structure and associated methods
        mainDataManager.someMethodAccess();
        xyz = mainDataManager.someDataAccess;
        mainDataManager.someIndirectMethodAccess.clear();
        mainDataManager.someOtherData = false;
    }
}

由于到目前为止我还没有这样做,我想知道这是否有任何问题。记忆力,效率......

非常感谢!

我可以加一点旁注吗? 我也可以使用类MainDataClass并通过MainDataClass.var or MainDataClass.method().访问是否有任何真正的劣势?

两种情况下的数据都保存在堆/堆栈中吗?

1 个答案:

答案 0 :(得分:0)

您没有详细介绍“大块数据”,但请记住,onCreate方法是应用程序启动时运行的第一个并且在主/ UI线程上运行的方法。这意味着如果你在init()方法中执行长任务,那么你的用户体验将很差,更不用说你冒着ANR异常的风险。

解决方案很简单:

  1. 保持onCreate简短
  2. 创建一个BG线程并使用它来运行所有初始化代码
  3. 在BG线程运行时,使用正确的进度条显示“启动”/“欢迎”屏幕。