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がプロセスを破壊して再作成する場合は、リソース/アセット/その他からこのデータを再度読み込むことが必要です。

データの性質によっては、RBuildConfigが生成されるような方法で、データを含むJavaを生成するコードが考えられます。そして、必要なときにデータが常にそこにあることが保証されます。

0
  • カスタムを登録するApplicationインスタンス。チェックアウトHow to
  • "ラージオブジェクト"を直接アプリケーションに保存することができます。しかし、常にシングルトンオブジェクトを保持する方が良いです。
  • Application#onCreateですべて完了した後に、「大きなリソース」を読み込むメソッドを呼び出します。これにより、リソースが一度だけロードされ、アプリケーションの起動時に保証されます。
  • 上記のリソースを非同期にロードします。
  • Voila!
関連する問題