Растровое изображение перерабатывается без обращения к нему - PullRequest
0 голосов
/ 03 ноября 2019

Я борюсь с досадной проблемой с моим приложением для Android, которую очень сложно описать без всего класса здесь (что было бы очень длинным постом), поэтому я рискну понизиться и описать сценарий

Я использую объект Bitmap, чтобы «записать» макет активности и сохранить его как файлы .jpg

Так что я делаю что-то вроде (это псевдокод)

this.tmpBitmap = Bitmap.createBitmap(this.canvasView.getWidth(), this.canvasView.getHeight(), Bitmap.Config.ARGB_8888);
            this.canv = new Canvas(this.tmpBitmap);

    viewKonfetti.getViewTreeObserver().addOnPreDrawListener(listener);

где

ViewTreeObserver.OnPreDrawListener listener = new ViewTreeObserver.OnPreDrawListener() {

                long lastDraw = 0;

                @Override
                public boolean onPreDraw() {
                    if (getRecordingLength() < MAX_VIDEO_LENGTH && System.currentTimeMillis() - this.lastDraw >= 600 / (float) FRAME_RATE && !tmpBitmap.isRecycled()) {
                        canvasView.draw(canv);
                        resizeAndSaveBitmap(tmpBitmap, resizedWidth, resizedHeight, Bitmap.CompressFormat.JPEG);
                        this.lastDraw = System.currentTimeMillis();
                    }
                    return true;
                }


            };

размеры макета никогда не изменятся, поэтому я повторно использую один и тот же растровый объект для экономии памяти.

Когда я заканчиваю запись, я делаю

viewKonfetti.getViewTreeObserver().removeOnPreDrawListener(listener);
tmpBitmap.recycle();

Но я часто получаю сообщение об ошибке:

W/Bitmap: Called getWidth() on a recycle()'d bitmap! This is undefined behavior!
    Called getHeight() on a recycle()'d bitmap! This is undefined behavior!
    Called getWidth() on a recycle()'d bitmap! This is undefined behavior!
    Called getHeight() on a recycle()'d bitmap! This is undefined behavior!
    Called getConfig() on a recycle()'d bitmap! This is undefined behavior!
    Called getConfig() on a recycle()'d bitmap! This is undefined behavior!
    Called hasAlpha() on a recycle()'d bitmap! This is undefined behavior!
A/Bitmap: Error, cannot access an invalid/free'd bitmap here!
W/google-breakpad: ### ### ### ### ### ### ### ### ### ### ### ### ###
    Chrome build fingerprint:
    69.0.3497.100
    349710017
    ### ### ### ### ### ### ### ### ### ### ### ### ###
A/libc: Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 25671 (gital.lottogram), pid 25671 (gital.lottogram)
I/OMXClient: IOmx service obtained

Нормальное исключение не выдается, это сообщение печатается в logcat без трассировки стека.

Я использовалнекоторые блоки синхронизации, чтобы исключить возможность какого-либо состояния гонки, но оно продолжает поступать.

эта ошибка не возникает в 100% случаев. я бы сказал, 50%, так что это похоже на какое-то состояние гонки, но я не могу найти где ... какой растровый объект вызывает эту проблему или какая строка кода его использует.

Кто-нибудь знает другой способотследить, какой объект вызывает эту ошибку

...