W moim kodu robię coś takiego:Dlaczego czasami bitmapy to te same obiekty?
public void doStuff() {
Bitmap scaledBitmap = decodeFileAndResize(captureFile);
saveResizedAndCompressedBitmap(scaledBitmap);
Bitmap rotatedBitmap = convertToRotatedBitmap(scaledBitmap);
driverPhoto.setImageBitmap(rotatedBitmap);
if (rotatedBitmap != scaledBitmap) {
scaledBitmap.recycle();
scaledBitmap = null;
System.gc();
}
}
private Bitmap convertToRotatedBitmap(Bitmap scaledBitmap) throws IOException {
ExifInterface exifInterface = new ExifInterface(getCaptureFilePath());
int exifOrientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0);
float orientationDegree = getRotationDegree(exifOrientation);
Matrix rotateMatrix = new Matrix();
rotateMatrix.postRotate(orientationDegree);
return Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), rotateMatrix, true);
}
Wszystko działa poprawnie, ale kiedy komentując if (rotatedBitmap != scaledBitmap) {
Mam błędów związanych z użytkowaniem Bitmap z recyklingu.
Czy Android tworzy nową mapę bitową dla każdego połączenia Bitmap.createBitmap
i jak mogę uniknąć porównywania bitmap?
Ponieważ metoda 'createBitmap (..)', której używasz, zwraca niezmienną bitmapę, prawdopodobnie zapisuje 'scaledBitmap' jako element, zamiast tworzyć nową bitmapę od zera. – harism
Właściwie, istnieje jedna opcja jeśli -clause w obrębie 'createBitmap (...)', która zwraca tę samą mapę bitową, która jest podana jako parametr. Może twój kod trafia w tę dokładnie sprawę, tworząc 'scaledBitmap == rotatedBitmap'. [Bitmap.java] (http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/graphics/Bitmap.java.htm) – harism
Myślę, że robisz coś złego tutaj. Linia kodu 'rotatedBitmap! = ScaledBitmap' da ci wartość true przez cały czas. Ponieważ porównujesz dwa obiekty i nie są one obiektami pierwotnymi. Tak więc dwa obiekty nie są sobie równe. – sampathpremarathna