2016-11-30 5 views
-1

Je me demandais pourquoi mon application ne fonctionnera pas sur le téléphone de mon ami. J'ai vérifié l'utilisation de RAM de mon application et j'ai découvert qu'il faut ~ 180 Mo pour charger toutes les images. Donc j'ai quelques questions:Application Android - RAM gratuite pour fonctionner

  • Est-il possible d'exécuter l'application qui nécessite 180 Mo de RAM sur le téléphone qui au moment de l'exécution a ~ 130 Mo de RAM libre? L'utilisation de RAM de 180 Mo, pendant le chargement de quelques images (150 Ko), est acceptable ou trop?
+0

'lors du chargement de quelques images (150kb un) est correct ou trop?' ** Evidemment ça ne dépend pas de leur taille "sur disque" ... ** ... * Je me demandais pourquoi mon application ne fonctionnerait pas sur le téléphone de mon ami * ... alors essayez ... Où est la question ? – Selvin

+0

'Est-il possible d'exécuter l'application qui a besoin de 180 Mo de RAM sur le téléphone qui au moment de l'exécution a ~ 130 Mo de RAM libre?' - mon problème principal. Un autre: Est-il possible de forcer le téléphone à effacer la RAM afin que mon application puisse fonctionner? – Filemon279

+0

* Est-il possible de forcer le téléphone à effacer la RAM * oui, disposer des bitmaps inutiles et gc ferait cela ... – Selvin

Répondre

0

J'ai vérifié RAM Utilisation de mon application et j'ai découvert, qu'il a besoin de ~ 180Mo pour charger tous les bitmaps.

Sur de nombreux appareils, si ce n'est la plupart des appareils, votre application n'a pas le droit d'avoir 180 Mo d'espace mémoire. Il existe une limite de tas par application, définie dans le microprogramme de l'appareil. Cela pourrait être aussi bas que 16 Mo, bien que 32-64 Mo est monnaie courante sur tous les appareils sauf les plus bas. Mais 180 Mo seraient exceptionnellement grandes.

Bien qu'il existe des moyens que votre application pourrait être en mesure d'avoir un tas de ~ 180Mo (par exemple, android:largeHeap), il y aura encore beaucoup d'appareils où vous ne serez pas obtenir beaucoup d'espace de tas.

Notez que la limite de tas est indépendante de la quantité de RAM disponible actuellement sur le périphérique. Ce n'est pas grave si le téléphone a ~ 13 Mo de RAM libre, ~ 130 Mo de RAM libre, ou ~ 1,3 Go de RAM libre — la limite de tas est la limite de tas.

Je vous encourage fortement à réduire votre utilisation du tas, idéalement d'un facteur 10 environ.

Est-il possible d'exécuter une application qui nécessite 180 Mo de RAM sur le téléphone qui, au moment de l'exécution a ~ 130 Mo de RAM libre?

Probablement. Android met fin à d'autres processus pour libérer de la RAM système pour la vôtre, en supposant que votre application est au premier plan à ce moment-là. Cela peut inclure la fin de certains processus que l'utilisateur préfèrerait mettre fin à et non à.

L'utilisation de la RAM de 180 Mo, lors du chargement de quelques images (150 kb), est acceptable ou trop?

À mon humble avis, c'est beaucoup trop.

+0

Merci pour cette information, je n'avais aucune idée à ce sujet – Filemon279

0

Yep 150kb image est trop .... vous devez le redimensionner de sorte que l'androïde allouer la mémoire en fonction des besoins. Il empêche le plantage de l'application OOM.

int resolution=100; 
    profileImageViewNav.setImageBitmap(decodeSampledBitmapFromResource(getResources(),R.drawable.profile_image, resolution, resolution)); 

Voici decodeSampledBitmapFromResource() fonction

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

Et voici le code de fonction calculateInSampleSize()

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
     // height and width larger than the requested height and width. 
     while ((halfHeight/inSampleSize) >= reqHeight 
       && (halfWidth/inSampleSize) >= reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 
+0

Merci pour la réponse, je suis déjà en utilisant ces fonctions et toujours le même problème. – Filemon279