0

ご存じのとおり、Android アプリの VM ヒープ サイズには制限があります。(ほとんどの場合、ハードウェアに応じて 16、24、32、48 または 64 MB の RAM)

で実際のヒープサイズを取得できます

ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
Toast.makeText(this, "HEAP SIZE: " + am.getMemoryClass() + "MB", 1).show();

.

しかし、新しいインテントを開いた場合のメモリ戦略は何ですか???:

Intent intent = new Intent(MainActivity.this, NewActivity.class);
MainActivity.this.startActivity(intent);

この新しいアクティビティは完全なヒープ サイズを取得し、古いアクティビティはバックグラウンドで保持され、そのメモリはキャッシュされますか?

それとも、インテントは完全に新しい VM を取得しますか?

私は非常にメモリを大量に消費するアプリを持っており、GridView と ListViews が大量に埋められています。Android 3.0 以降、ビットマップはヒープ内に割り当てられるため、OutOfMemory エラーで多くの頭痛とトラブルが発生します... メモリを大量に消費するビューを独自のインテントでアウトソーシングできるかどうか疑問に思っていました。<--これは意味がありますか?

4

2 に答える 2

0

Raghav Soodに同意します。リストビューまたはグリッドビューで画像を表示する方法をもう少し追加しました。

Universal Image loaderを使用して、リストビューに多数の画像を表示しました。

使用しないときは、ビットマップをリサイクルする必要があります。

http://www.youtube.com/watch?v=_CruQY55HOk . トークは、メモリ管理とメモリ リーク、およびそれを回避する方法についてです。メモリ リークが発生した場合は、MAT アナライザーを使用してメモリ リークを見つけることができます。このビデオでは、MAT アナライザーの使用についても説明し、メモリ リークを取り除く方法を示します。

リストビューで画像を表示するときは、ビューをリサイクルする必要があります。表示されているビューはリサイクルされません。

グリッドビューまたはリストビューで画像を表示するには、ユニバーサル画像ローダーを使用できます。遅延読み込みの改良版。画像はキャッシュされます。ローカルまたはサーバーから画像を表示できます。

https://github.com/nostra13/Android-Universal-Image-Loader

 File cacheDir = StorageUtils.getOwnCacheDirectory(context, "your folder");

 // Get singletone instance of ImageLoader
 imageLoader = ImageLoader.getInstance();
 // Create configuration for ImageLoader (all options are optional)
 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
      // You can pass your own memory cache implementation
     .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
     .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
     .enableLogging()
     .build();
 // Initialize ImageLoader with created configuration. Do it once.
 imageLoader.init(config);
 options = new DisplayImageOptions.Builder()
 .showStubImage(R.drawable.stub_id)//display stub image
 .cacheInMemory()
 .cacheOnDisc()
 .displayer(new RoundedBitmapDisplayer(20))
 .build();

あなたの getView() で

 ImageView image=(ImageView)vi.findViewById(R.id.imageview); 
 imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options

ニーズに合わせて他のオプションを設定できます。

Universal Image Loader とともに、スムーズなスクロールとパフォーマンスのためにホルダーを表示できます。http://developer.android.com/training/improving-layouts/smooth-scrolling.html .

http://www.youtube.com/watch?v=wDBM6wVEO70。トークは、ビューホルダーとパフォーマンスについてです。

于 2013-03-26T14:36:26.430 に答える
0

すべてのプロセスには、デバイスが指定するサイズ (デバイスに Google Play がインストールされている場合は最小 16 MB) のヒープが 1 つあります。

アプリは単一のプロセスであるため、アプリのコンポーネントはすべてこのヒープ内で実行する必要があります。したがって、Activity、Service、BroadcastReceivers はすべて同じヒープを共有します。

新しいアクティビティを起動すると、以前のアクティビティがバックグラウンドにプッシュされます。このため、それonPause()が呼び出され、必要に応じてそのメソッドを使用してメモリを解放する (ロードされたビットマップなどを削除する) 必要があります。

また、outsorce the memory hungry Views in their own Intentsアクティビティやサービスなどのアプリケーション コンポーネントを開始するためにインテントが使用されるため、意味がありません。インテントでビューを使用することはできません。代わりに、ビットマップをスケーリングして必要なサイズのみをロードし、遅延ロードなどの手法を使用して、メモリ内に必要以上のビットマップがないようにする必要があります。

于 2013-03-26T14:23:52.073 に答える