0

我想在启动Android应用程序时从资源和资产加载大型数组,并在多个使用的活动中访问这些对象。在应用程序启动时加载大对象

现在我加载资源,我的发射活动:

StartActivity.java:

 Object heavyObject; 

     onCreate() { 
     new AsyncTask<Void, Void, Exception>() { 
      @Override 
      protected Exception doInBackground(Void... params) { 
       try { 
        Assets assets = new Assets(context); 
        File assetDir = assets.syncAssets(); 
        heavyObject = heavySetup(assetDir); 
       } catch (IOException e) { 
        return e; 
       } 
       return null; 
      } 
     }.execute(); 

... 

    public void goToNextActivity() { 
     Intent intent = new Intent(base_activity, NextActivity.class); 
     Bundle b = new Bundle(); 
     b.putObject("ho", heavyObject); 
     intent.putExtras(b); 
     startActivity(intent); 
     finish(); 
    } 

但这复制对象多次,并导致内存问题。如何在应用程序的生命周期中跨我的活动共享对象,并且只加载和存储一次?

回答

0

将数据置于static字段中。这是一个有意的内存泄漏,所以要小心:

  • 不要让更多的数据

  • 浇如果你到一个地步,你不再需要它,null了现场,让Android来垃圾收集该数据

另外,请注意,只有您的流程存在此数据。如果Android销毁并重新创建您的流程,您需要有条件从您的资源/资产/其他任何地方再次延迟加载这些数据。

根据数据的性质,您可能会考虑生成一些Java中包含数据的代码,这是生成RBuildConfig的方式。然后,你可以保证数据总是在你需要的时候。

0
  • 注册自定义Application实例。结帐How to
  • 您可以决定将“大型对象”直接存储在应用程序中。但最好保留一个单独的对象
  • 调用方法加载你的“大资源”,毕竟一切顺利,并在Application#onCreate完成。这保证您的资源只加载一次,并在应用程序启动时
  • 异步加载所述资源。
  • Voila!
相关问题