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!
相關問題