レイアウトで作成したカスタムビューを使用しているときに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);
}
}
OK、これはなぜ全く分からないが、スリープモードに入るとき、本質的に何が起こるには、ビューがウィンドウから外れますし、その後の活動が再び始まり?!?だから、デバイスがスリープ状態になったときにアクティビティが再起動しているようなものです...なぜこれがわからないのですか? – gunboatmedia