0
當使用在佈局中創建的自定義視圖時,我在Android中收到標準java.lang.OutOfMemoryError。我正在使用位圖,但我不明白的是,只有當設備進入睡眠模式時纔會發生這種情況。我調試了代碼,並發現當設備進入睡眠模式時,由於某種原因,它再次在自定義視圖上運行構造函數,我不知道爲什麼會這樣,自定義視圖的代碼在下面,任何人都可以解釋爲什麼構造函數是設備睡眠時再次運行?而且,如果我在處理Bitmaps時出現了一些明顯的錯誤,那就好了,因爲我知道我在某處出錯了。非常感謝......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 2012-01-04 10:34:25