Я борюсь с досадной проблемой с моим приложением для 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%, так что это похоже на какое-то состояние гонки, но я не могу найти где ... какой растровый объект вызывает эту проблему или какая строка кода его использует.
Кто-нибудь знает другой способотследить, какой объект вызывает эту ошибку