在应用启动时加载大对象

时间:2016-11-20 00:17:31

标签: android memory-management global-variables android-assets

我想在启动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();
    }

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

2 个答案:

答案 0 :(得分:0)

将数据放入static字段。这是故意的内存泄漏,所以要小心:

  • 不要继续倾注更多数据

  • 如果您到达不再需要它的位置,null出现该字段以允许Android垃圾收集该数据

另请注意,只有您的流程可以使用此数据。如果Android破坏并重新创建您的流程,您需要从资源/资产/其他任何地方再次延迟加载此数据。

根据数据的性质,您可能会考虑生成一些包含数据的Java的代码,即生成RBuildConfig的方式。然后,您确保在需要时数据始终存在。

答案 1 :(得分:0)

  • 注册自定义Application实例。结帐How to
  • 您可以决定存储&#34;大对象&#34;直接在应用程序中。但是保持单个对象
  • 总是更好
  • 调用方法加载您的&#34;大资源&#34;毕竟在Application#onCreate完成并完成了。这可以保证您的资源只加载一次,并且在应用程序启动时
  • 异步加载所述资源。
  • 瞧!