すべてのアクティビティの背景として設定する画像を使用していますが、メモリ オーバーフローの問題が発生し、アプリがクラッシュしていました。現在、アクティビティのpause()およびDestroy()でドローアブルのバインドを解除していますが、戻るボタンを押すと空白の画面が表示されます。では、余分なメモリを使用せずにこれを回避するにはどうすればよいでしょうか。
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.login_root));
}
protected void onDestroy() {
unbindDrawables(findViewById(R.id.login_root));
super.onDestroy();
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
最初は android:background="@drawable/" を使用してレイアウトを膨らませていましたが、これは常にメモリ オーバーフロー エラーを引き起こし、VM では 10MB を割り当てることができないというメッセージを表示していました (アプリ)。 VM は、unbindDrawables(..) を使用せずに 5MB (app.) を割り当てることはできません。表示される背景画像の品質は明らかに低下しましたが、 png ファイルが 13KB の場合、JVM はリクエストを処理するために 5 MB または 10 MB のスペースをどのように必要としますか?
レイアウトステートメントを onCreate() から onResume() メソッドにシフトしましたが、アプリケーションは戻るボタンを押すと再びメモリ不足になります。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void onResume(){
setContentView(R.layout.home);
Bitmap bmp;
ImageView background = (ImageView)findViewById(R.id.iv_home_background);
InputStream is = getResources().openRawResource(R.drawable.background);
bmp = BitmapFactory.decodeStream(is);
background.setImageBitmap(bmp);
super.onResume();
}
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.home_root));
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}