2010-07-24 4 views
5

J'ai une application cartographique défilante qui a pour l'instant un énorme bitmap. Il se charge bien au démarrage, mais quand il perd son statut de premier plan et que l'utilisateur le ramène à nouveau, il obtient une erreur de mémoire insuffisante. Dans onPause, il supprime le bitmap à l'aide de recycle et le marque comme nul. Le onResume vérifie si map == null et chargera le bitmap de nouveau, ce qui plante le programme malgré le recyclage de l'image bitmap ... Voici quelques morceaux de code. Toutes les autres références à la carte Bitmap vérifient d'abord si elle est nulle avant de charger/dessiner.Erreur de mémoire insuffisante concernant les grandes images et le cycle de vie de l'activité Android

OnPause

protected void onPause() { 
super.onPause(); 
Log.e("sys","onPause was called"); 
if (map != null) 
{ 
     map.recycle(); 
     map = null; 
     System.gc(); 
     Log.e("sys","trashed the map"); 
} 
} 

mon onResume

protected void onResume(){ 
super.onResume(); 
Log.e("sys","onResume was called"); 

if (map == null) 
     map = BitmapFactory.decodeResource(getResources(), 
         R.drawable.lowresbusmap); 
Log.e("sys","redrew the map"); 
} 
+0

Vous obtenez cette erreur dans le débogueur, ou sur un vrai téléphone ? – EboMike

+0

sur un vrai téléphone (droïde motorola) – jfisk

Répondre

0

Essayez cette façon:

protected void onResume(){ 
    super.onResume(); 
    if (map == null){ 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inTempStorage = new byte[16*1024]; 

     map = BitmapFactory.decodeResource(getResources(), 
         R.drawable.lowresbusmap, options); 
    } 
} 
+0

pas de chance, cette image est en fait destiné à des téléphones plus rapides. Les plus lents comme le G1 utiliseront un bitmap plus petit. Dans ce cas devrais-je changer 16 * 1024 à 24 * 1024? Malheureusement, ce code me donne toujours la même erreur. – jfisk