Bild in hoher Auflösung - OutOfMemoryError
Ich entwickle eine Anwendung für das Galaxy S4.
Eine der Anforderungen der Anwendung ein SplashScreen mit einem Bild von 1920x1080 Pixel. Es ist eine hohe Qualität .jpeg-Bild und die Größe des Bildes ist ungefähr 2 Megabyte.
Das problem ist, dass ich immer ein OutOfMemoryError sobald ich die Anwendung starten. Ich bin ziemlich fassungslos, dass dies bereits geschieht, mit einem Bild nur 2 MB groß ist? Wie kann ich dieses problem beheben und zeigt das Bild?
Änderung der Größe oder die Größe des Bildes ist nicht eine option.
SplashScreen.java
public class Splashscreen extends Activity {
private static final int SPLASH_DURATION = 2000;
private boolean isBackPressed = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(LayoutParams.FLAG_FULLSCREEN, LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
//check if the backbutton has been pressed within the splash_duration
if(!isBackPressed) {
Intent i = new Intent(Splashscreen.this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Splashscreen.this.startActivity(i);
overridePendingTransition(R.anim.short_fade_in, R.anim.short_fade_out);
}
finish();
}
}, SPLASH_DURATION);
}
@Override
public void onBackPressed() {
isBackPressed = true;
super.onBackPressed();
}
}
Und die splashscreen.xml
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ivSplashScreenImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/high_res_splashscreen_image"/>
ZUSÄTZLICHE INFORMATIONEN:
Manchmal (wenn viel Speicher des Gerätes verfügbar) die app ist in der Lage, um es vorbei an der splash-screen, aber dann, den Speicherverbrauch der app ist einfach der Wahnsinn. (rund 100 megabyte). Obwohl ich in der Nähe der SplashScreen-Activity und finish (), scheint es, dass es einen Verweis auf die Bildansicht /das Bild im Speicher gehalten.
Wie kann ich reduzieren, die großen Speicherbedarf?
Wenn ich nicht die Anzeige des splash-screen, die app verbraucht nur rund 35 MB
der Speicher. Mit der SplashScreen-image, das rund 100 MB.
InformationsquelleAutor der Frage Philipp Jahoda | 2013-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Drei Tipps, die Ihnen helfen sollen:
Verwenden Sie diese, um Ihre Bilder laden, von Laden von Großen Bitmaps Android-Dokumentation:
Stellen Sie sicher, dass nur eine Instanz der
Bitmap
im Speicher. Nachdem es anzuzeigen, rufen Sierecycle()
und setzen Ihre Referenz zunull
. Sie können Memory Allocation Trackerum zu sehen, was zugeordnet ist. Sie können auch Lesen, HPROF-Dateien, wie vorgeschlagen, in den Kommentaren.Standardmäßig
ARGB_8888
pixel-format verwendet wird, was bedeutet, dass 4 bytes pro pixel. Sehr guter Artikel: Bitmap-Qualität, banding und dithering. Dein Bild ist JPEG, es gibt also auch keine Transparenz haben, so dass Sie verschwenden 1 byte für jeden pixel der alpha-Kanal. Es ist nicht sehr wahrscheinlich, aber vielleicht mit akzeptabler Qualität können Sie sogar sparsamer-format. Nehmen einen Blick auf Sie. VielleichtRGB_565
zum Beispiel. Es dauert 2 bytes für pixel, so dass Ihr Bild wäre 50% heller. Sie können dithering zur Verbesserung der Qualität derRGB_565
.InformationsquelleAutor der Antwort Adam Stelmaszczyk
Ich hatte ein ähnliches problem und die Lösung ist einfach. Setzen Sie Ihre hohe Auflösung 1920x1080 px Bild in der drawable-nodpi - Verzeichnis. Das system nicht skaliert getaggte mit diesem Beinamen unabhängig von der aktuellen Bildschirm-Dichte, was dazu führt, OutOfMemoryError, damit sollte das problem verschwinden.
Überprüfen Sie bitte die Android-Dokumentation: http://developer.android.com/intl/es/guide/practices/screens_support.html
Hoffe, es hilft.
InformationsquelleAutor der Antwort Alejandro Casanova