2011-06-22 14 views
3

私の小さなアプリケーションは、5番目または6番目の画面回転後に常にクラッシュします。 2つの主要なレイアウトが定義されています.1つは風景用のレイアウトです。メモリリークを探して一日中過ごした後、私は問題を見つけました。私はJPGをメインアクティビティのバックグラウンドとして定義しました。 JPGをPNGに変更した後、メモリの問題は解決されました。アクティビティの背景としてJPGがメモリリークを生成する

バックグラウンドはdrawableとして定義され、main.xmlで定義されています。

2.2(エミュレータ)のアプリをテストしたが、2.3.1(エミュレータも)のアプリがクラッシュして問題が発生していませんでした。

誰かがこの問題を再現できますか?


今、私は、次のコードに私のアプリを削減:今すぐメモリが一定... あなたは、これがメモリリークを回避するために必要であることを画像化することができます

package at.memtest; 

import android.app.Activity; 
import android.graphics.drawable.BitmapDrawable; 
import android.os.Bundle; 
import android.widget.LinearLayout; 

public class MemTestActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

@Override 
protected void onDestroy() { 
    recycleImages(); 
    super.onDestroy(); 

} 

@Override 
protected void onPause() { 
    recycleImages(); 
    super.onPause(); 
} 


private void recycleImages() { 
    final LinearLayout theView = (LinearLayout) findViewById(R.id.main_layout); 
    if (theView != null) { 
     final BitmapDrawable background = (BitmapDrawable) theView.getBackground(); 
     if (background != null) { 
      background.getBitmap().recycle(); 
     } 
    } 
} 
} 

? 私が上記のように、私が背景として使用する画像は約220KのPNGです。

+0

OnPauseで1回、onDestroyで1回、recycleImagesを2回呼び出すのではないですか? – quinestor

答えて

0

あなたはそれが問題のファイル形式だと確信していますか?これを試してみてください:http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html

PNGのメモリが不足している可能性があります。

+0

ありがとうが、私はこれを何度か読んだ。プログラムコードのほとんどをコメントアウトするのに1日かかりました。私がやった最後のことはPNGにJPGを変更することでした。ヒープは一定のままです...私のソリューションは少し奇妙に聞こえますが、スクリーンを回転させて(問題を引き起こす前に)約100回はクラッシュしなくなりました。 –

+0

ああ男 - あなたは正しい。私は別のテストをしました:約900サイクルを意味する4分の1の方向を反転させる15分。 約2時間後に反転している次のコードのビット: –

+0

申し訳ありませんが、コメントは完全ではありませんでした: ああ男 - あなたは正しいです。私は別のテストをしました:約900サイクルを意味する4分の1の方向を反転させる15分。 しかし、次のコードでは、約2時間以降裏返しだ: \t @Override \t保護無効onResume(){ \t \t super.onResume(); \t \t System.gc(); \t} あなたはそれを信じることができますか?今、ヒープはかなり一定のままです。私の記憶の問題は、エミュレータによってのみ引き起こされると思いますか? –

0

同じ問題が発生しました。
.jpgの代わりに.pngを使用して、問題を解決しました。

+0

私はpng背景イメージも使用していますが、私はリークしています。だからまだトラブル。 – Lisitso

0

jpg背景画像に問題があり、特定の端末でアプリの動作が極端に遅くなりました。しかし、PNGを使ってもそれは私のために解決されませんでした。私は、実行時に圧縮解除のための努力を余儀なくされたかもしれないスペースを節約するために、私が画像に対して選択した高圧縮とは何かがあるかもしれないと思います。

関連する問題