Problem z resetowaniem Canvas - runtime exception tylko na telefonach Xiami oraz Huawei Mate 9

0

Mam w aplikacji mapę świata (bitmapa) na której zaznaczają się kropki.
Generalnie kod inicjowania wygląda tak:

background = BitmapFactory.decodeResource(res, R.drawable.world);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(background, d, h, true);
background.recycle();
background = scaledBitmap;
bg = Bitmap.createBitmap(d, h, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bg);
img.setImageBitmap(bg);

gdzie d i h to wymiary bitmapy w aplikacji. Potem są proste operacje na Canvas i nic więcej.

Resetowanie Canvas wygląda tak:

Paint clearPaint = new Paint();
clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRect(0,0,d,h,clearPaint);
canvas.drawBitmap(background, 0, 0, null);

Wyjątek powoduje konkretnie ostatnia linia z powyższego kodu.
Co dziwne aplikacje testowałem mocno na wielu telefonach i było ok. Widzę z danych w konsoli Google Play, że wyjątki pojawiają się tylko na 2 telefonach Xiami oraz na Huawei Mate 9 - do tych telefonów dostępu nie mam.

0

a logi masz z tych bledow? jakis Fabric?

0

Zgodnie z wytycznymi Google "Prepare for Release" usunąłem logi przed publikacją.
Nie mam więc nic poza tym co udostępnia Konsola Google Play.

0

Ale pochwalisz się jaki to wyjątek, czy mamy zgadywać?

1

P.S. pomyśl o podłączeniu do Firebase Crash Reporting.

0

Strzelam że bitmapa jest za duża

0

Pochwaliłem się w temacie ;) Runtime Exception.
Napisał do mnie jeden z użytkowników i wysłał screenshota z którego wynika, że dla jednych telefonów ta bitmapa z tłem wklejana w metodzie czyszczącej jest ok, niektóre uznają jednak, że została recycled, więc nie może być użyta.
Wygląda na to, że powinna wystarczyć zmiana nazw zmiennych, by nie wykorzystywać ich powtórnie ?!?

screenshot

0

Rusz głową trochę, to nie boli. Skoro bitmapa tła jest wyczyszczona (recycled), to znaczy że wcześniej coś nie zadziałało i nowa bitmapa nie została utworzona. Nie widzę, żebyś gdzieś sprawdzał, czy to:

Bitmap scaledBitmap = Bitmap.createScaledBitmap(background, d, h, true);

wykonało się prawidłowo. Potem robisz background.recycle() i ustawiasz nową bitmapę, jeśli będzie pusta to będziesz mieć objaw taki jak napisałeś. To jest dobry trop, że próbujesz operować na zbyt dużych bitmapach.

0

scaledBitmap to przeskalowany obrazka tła wziętego z pliku do potrzebnych rozmiarów.
Obrazek z pliku przenoszony jest w zmiennej "background", później ta zmienna jest czyszczona i jest wykorzystywana ponownie by przechować referencje do już przeskalowanego obrazka - po to by wykorzystać go później do czyszczenia Canvas. Wszystko jest ok. I na większości telefonów to działa.
Czyli w pamięci mam 2 bitmapy, jedną jako wzorzec, drugą do edycji. Obie mają 2400x1056px, czyli nie są jakieś ogromne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1