L'Image en haute résolution - OutOfMemoryError
Je suis du développement d'une application pour le Galaxy S4.
L'une des exigences de l'application est d'avoir un écran d'accueil contenant une Image de 1920x1080 pixels. Son de haute qualité .d'image jpeg et la taille de l'Image est d'environ 2 Mégaoctets.
Le problème est que j'obtiens un OutOfMemoryError dès que je démarre l'Application. Je suis très étonné que cela se produit déjà avec une image de seulement 2 mo en taille? Comment puis-je résoudre ce problème et afficher l'image?
Changer les dimensions ou la taille de l'image n'est pas une 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();
}
}
Et la 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"/>
INFORMATIONS SUPPLÉMENTAIRES:
Parfois (quand il y a beaucoup de mémoire de l'appareil est disponible) l'application est en mesure de le faire passé l'écran de démarrage, mais ensuite, la consommation de mémoire de l'application est juste fou. (autour de 100 mégaoctets). Même si je ferme l'écran d'accueil de l'Activité et de l'arrivée (), il semble qu'il y a une référence à l'ImageView /l'Image conservée en mémoire.
Comment puis-je réduire l'énorme consommation de mémoire?
Quand je n'ai pas l'affichage de l'écran de démarrage, mon application ne consomme environ 35 MO
de la mémoire. Avec le SplashScreen image, de sa autour de 100 mo.
Avez-vous avez beaucoup de fichiers d'image dans votre dossier res??
Oui, j'ai environ 40 fichiers d'image. Mais ils ne sont pas très grandes (juste les icônes de la plupart d'entre eux), ayant entre 10 et 50 ko en taille.
OriginalL'auteur Philipp Jahoda | 2013-08-22
Vous devez vous connecter pour publier un commentaire.
Trois conseils qui devraient vous aider:
Utiliser pour charger vos images, de Le chargement d'un Grand Bitmaps Android documentation:
Assurez-vous d'avoir une seule instance de votre
Bitmap
dans la mémoire. Après l'affichage, appelrecycle()
et de définir votre référence ànull
. Vous pouvez utiliser L'Allocation De La Mémoire Tracker pour voir ce qui est alloué. Vous pouvez également lire les HPROF fichiers, comme suggéré dans les commentaires.Par défaut
ARGB_8888
format de pixel est utilisé, ce qui signifie 4 octets par pixel. Très bon article: Bitmap de la qualité, le baguage et le tramage. Votre image doit être au format JPEG, afin de ne pas avoir de la transparence, de sorte que vous perdez 1 octet pour chaque pixel pour le canal alpha. Ce n'est pas très probable, mais peut-être avec une qualité acceptable, vous pouvez utiliser le même format plus économique. Prendre un coup d'œil. Peut-êtreRGB_565
par exemple. Il faut que les 2 octets par pixel, de sorte que votre image serait 50% plus léger. Vous pouvez activer le tramage pour améliorer la qualité deRGB_565
.J'ai mis l'image de la ressource dans la .fichier xml "@null" et maintenant la charge de l'image comme ça: "((ImageView) findViewById(R. id.ivSplashScreenImage)).setImageBitmap(decodeSampledBitmapFromResource(getResources()R. drawable.highres, 1920, 1080));" je suis maintenant en mesure de passer l'écran d'accueil, mais mon application la consommation de mémoire est toujours aux alentours de 90 MO. (sans l'écran de démarrage, à ses 35-40 mo)
En théorie, une image de taille 1920x1080 ne devrait être d'environ 8 MO. Pouvez-vous jeter un oeil à une HPROF de vidage à assurez-vous de n'attribuer l'une de ces images? Maintenant que vous êtes manuellement chargement de l'image, assurez-vous de le recycler et nulle référence à une fois l'écran de démarrage de la ferme. Analyse de la Mémoire pour les Applications Android
J'ai mis à jour ma réponse.
Désolé, la modification de l'image à compresser il n'est malheureusement pas une option 🙁 Cependant, le recyclage a fait le travail. Merci beaucoup pour votre aide!
OriginalL'auteur Adam Stelmaszczyk
J'ai eu un problème similaire et la solution est simple. Mettez votre haute résolution 1920 x 1080 px image dans le drawable-nodpi répertoire. Le système n'est pas à l'échelle des ressources marqués par ce qualificatif quel que soit l'écran de la densité, ce qui conduit à la OutOfMemoryError, de sorte que le problème devrait disparaître.
Veuillez vérifier Android documentation: http://developer.android.com/intl/es/guide/practices/screens_support.html
Espère que cela aide.
OriginalL'auteur Alejandro Casanova