OutOfMemoryError Java Ошибка при использовании настраиваемого представления в Android и устройство переходит в спящий режим - PullRequest
0 голосов
/ 04 января 2012

Я получаю стандартную ошибку 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);

}

}

1 Ответ

0 голосов
/ 08 мая 2012

Работаете ли вы в ландшафтном режиме? Я полагаю, вы настроили манифест android:screenOrientation="landscape" нет? Что я обнаружил, так это то, что в том случае, когда активность будет стоять рядом, она снова воссоздается как портрет.

Чтобы предотвратить это, сообщите Android, что вы будете обрабатывать ориентацию экрана, добавив следующую строку в разделе «Активность» в файле манифеста:

android:configChanges="keyboardHidden|orientation"

надеюсь, что это решит вашу проблему.

Ура;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...