2012-01-04 3 views
0

レイアウトで作成したカスタムビューを使用しているときにAndroidの標準java.lang.OutOfMemoryErrorが表示されます。私はビットマップを使用していますが、これはデバイスがスリープモードになった場合にのみ発生します。私はコードをデバッグし、何らかの理由でデバイスがスリープモードに入ったときに、カスタムビューのコンストラクタを再度実行します。これは、なぜカスタムビルドのコードが下にあるのかわかりません。なぜコンストラクタがデバイスがスリープ状態になったときに再度実行されますか?また、ビットマップの処理に明白なエラーがある場合は、私がどこかで間違っていることを知っているのでうれしいでしょう。おかげでたくさん...OutOfMemoryError Androidでカスタムビューを使用しているときにJavaエラーが発生し、デバイスがスリープモードに入る

public class LogoView extends View { 

private static final int[] FRAMES_FILE_NAMES = { R.drawable.logo0000, 
     R.drawable.logo0001, R.drawable.logo0002, R.drawable.logo0003, 
     R.drawable.logo0004, R.drawable.logo0005, R.drawable.logo0006, 
     R.drawable.logo0007, R.drawable.logo0008, R.drawable.logo0009, 
     R.drawable.logo0010, R.drawable.logo0011 }; 

private Bitmap[] mBitmapFrames; 

private Context mContext; 

private int mHeight; 
private int mWidth; 
private int mLeftPadding; 

private float mScale; 

private boolean mResourcesLoaded = false; 

public LogoView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mContext = context; 
    mBitmapFrames = new Bitmap[FRAMES_FILE_NAMES.length]; 


} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (!mResourcesLoaded || mBitmapFrames[0].isRecycled()) { 

     mHeight = this.getHeight(); 
     Bitmap preProc = ((BitmapDrawable) mContext.getResources().getDrawable(FRAMES_FILE_NAMES[0])).getBitmap(); 
     int preProcHeight = preProc.getHeight(); 
     int preProcWidth = preProc.getWidth(); 
     mWidth = (int) (((double) preProcWidth/(double) preProcHeight) * (double) mHeight); 
     mScale = (float) mHeight/(float) preProcHeight; 
     mLeftPadding = (int)(((double)(((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth()-(double)mWidth))/2d); 

     Matrix matrix; 
     for (int x = 0;x<FRAMES_FILE_NAMES.length;x++) { 

      preProc = ((BitmapDrawable)mContext.getResources().getDrawable(FRAMES_FILE_NAMES[x])).getBitmap(); 
      matrix = new Matrix(); 
      matrix.reset(); 
      matrix.postScale((float)mScale,(float)mScale); 
      mBitmapFrames[x] = Bitmap.createBitmap(preProc, 0, 0, preProc.getWidth(), preProc.getHeight(), matrix, false);   
     } 
     preProc.recycle(); 
     mResourcesLoaded = true; 


    } 
    canvas.drawBitmap(mBitmapFrames[0], mLeftPadding, 0, null); 

} 

}

+0

OK、これはなぜ全く分からないが、スリープモードに入るとき、本質的に何が起こるには、ビューがウィンドウから外れますし、その後の活動が再び始まり?!?だから、デバイスがスリープ状態になったときにアクティビティが再起動しているようなものです...なぜこれがわからないのですか? – gunboatmedia

答えて

0

あなたは横長モードで活動を実行していますか?私はあなたがマニフェストで設定すると思いますandroid:screenOrientation="landscape"いいえ?私が見つけたのは、アクティビティが起きる場合に、もう一度肖像画として再作成されたことです。

マニフェストの[Activity]セクションに次の行を追加して、画面の向きを処理することをAndroidに通知しますファイル:

android:configChanges="keyboardHidden|orientation" 

あなたの問題を解決することを望みます。

乾杯;)

関連する問題