2010-07-23 24 views
0

J'essaie de définir un fond d'écran différent pour chaque écran d'accueil, mais je reçois des problèmes OutOfMemory. J'ai 5 Bitmaps que j'essaie de superposer sur un bitmap de fond d'écran qui est 5 fois la largeur d'affichage. En utilisant le code ci-dessous, je reçois OOM. Le problème semble être la première ligne de code qui crée le grand fond d'écran Bitmap. Ma question est de savoir s'il existe un moyen de le faire (c'est-à-dire d'une manière qui nécessite moins de mémoire, ou d'allouer plus de mémoire?). Merci!Android - Un fond d'écran Bitmap différent pour chaque écran d'accueil - OutOfMemory

Bitmap wallpaper = Bitmap.createBitmap(displayWidth*5,displayHeight, Config.ARGB_8888); 
Canvas canvas = new Canvas(wallpaper); 
Uri data = getIntent().getData(); 
Bitmap bmp = getBitmap(data, imagePosition, displayWidth, displayHeight); 
canvas.drawBitmap(bmp, 0, 0,null); 
WallpaperManager wallpaperManager = (WallpaperManager) SetterActivity.this.getSystemService(Context.WALLPAPER_SERVICE); 
wallpaperManager.setBitmap(wallpaper); 
wallpaperManager.suggestDesiredDimensions(bmp.getWidth()*2, bmp.getHeight()); 
+0

Quelle est la taille de vos bitmaps? – Sephy

+0

Eh bien, je suis en train de tester sur un Nexus One qui a une taille d'écran de 480x800. D'abord je crée le fond d'écran Bitmap qui doit être 5 fois plus grand (2400x800). Ensuite, pour chaque écran d'accueil, je vais dessiner un autre bitmap sur le Canvas de taille 480x800. – timothyjc

+0

quelles sont les valeurs de displayWidth et displayHeight? sont-ils la largeur intrinsèque et la hauteur? (myBitmap.getIntrinsicWidth(), myBitmap.getIntrinsicHeight();) – Jorgesys

Répondre

0

Si vous ne pouvez pas vous déplacer avec 5 écrans d'images chargées vaut à la fois, vous pouvez essayer de n'avoir un chargé à la fois, et passer en fonction de l'écran d'accueil qui est en cours de visualisation.

Autrement dit, vous avez 2 bitmaps en mémoire, l'un est current et l'autre est next. Chargez le bitmap current à la première vue. Utilisez onOffsetsChanged pour déterminer quand un défilement se produit et à ce moment-là, chargez le bitmap next en fonction de l'écran d'accueil qui s'affichera ensuite. Vous aurez besoin de faire cette interpolation de l'écran A à B par vous-même. lorsque le parchemin est terminé, recyclez current et enregistrez next sous la forme current.

Je suis sûr qu'il y a quelques pièges dans cette implémentation auxquels je ne pense pas pour l'instant, mais vous n'aurez que 2 bitmaps alloués avec cette méthode. Bonne chance!

0

Les données bitmap sont allouées dans le tas natif (voir BitmapFactory OOM driving me nuts pour plus de détails). Le montant disponible dépend de la plate-forme (par exemple, le niveau d'API 2.2 a un total de tas natif de 24 Mo), mais il n'y a aucun moyen de le développer au-delà. La quantité d'espace de segment natif allouée dépend de ce que vos applications et d'autres font avec les bitmaps/graphiques.

Votre première ligne de bitmap code/fond d'écran est seulement 480 * 800 * 32/8 = 1.536 Mbytes, ce qui est bien dans le maximum. Il semble donc probable qu'une grande partie du tas est déjà allouée au moment où vous arrivez à cette ligne?

Notez que le tas natif est garbage collecté mais rarement - et les données ne sont pas récupérées si l'application ne le libère pas explicitement. Donc, si vous exécutiez une application sans recycler vos bitmaps (dans onDestroy), vous pourriez bien manger le tas natif après quelques runs.