Я получаю стандартную ошибку java.lang.OutOfMemoryError в Android при использовании пользовательского представления, созданного в макете. Я использую растровое изображение, но я не понимаю, что это происходит только тогда, когда устройство переходит в спящий режим. Я отладил код и по какой-то причине обнаружил, что когда устройство переходит в спящий режим, оно снова запускает конструктор в настраиваемом представлении, и я понятия не имею, почему так, код настраиваемого представления приведен ниже, кто-нибудь может объяснить, почему конструктор запускается снова, когда устройство спит? А также, если в моей обработке растровых изображений есть какие-то очевидные ошибки, было бы неплохо, поскольку я знаю, что где-то я ошибаюсь. Большое спасибо ...
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);
}
}