Bitmap decodeStream Exception OutOfMemory
Je suis en utilisant ma propre mise en œuvre de ViewFlow
exemple pour Android dans mon application. Je suis le téléchargement crypté images à partir du web service et que de les garder 'em sur la Carte SD. Je suis en utilisant viewflow à décrypter les images à la volée et de les montrer. Mais le problème est que lorsque l'utilisateur commence à modifier les images trop vite, c'est en me jetant un OutOfMemoryException
et toutes les informations que j'ai trouvé/test ne fonctionne pas pour ma situation. Voici ce que j'utilise :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.image_item, null);
}
try {
File bufferFile = new File(ids.get(position));
FileInputStream fis = new FileInputStream(bufferFile);
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec("01234567890abcde".getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec("fedcba9876543210".getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
CipherInputStream cis = new CipherInputStream(fis, cipher);
BitmapFactory.Options o = new BitmapFactory.Options();
final int REQUIRED_SIZE=300*1024;
//Find the correct scale value. It should be the power of 2.
int width_tmp= o.outWidth, height_tmp= o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
Bitmap ops = BitmapFactory.decodeStream(cis,null,o2);
((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ops);
cis.close();
fis.close();
System.gc();
} catch (Exception e) {
e.printStackTrace();
((ImageView) convertView.findViewById(R.id.imgView)).setImageResource(R.drawable.image_unavailablee);
}
return convertView;
}
Et c'est toujours en me jetant à cette exception à la ligne :
((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ops);
avec cette exception :
java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=6791KB, Allocated=3861KB, Bitmap Size=26006KB)
Toutes les idées comment résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Juste pour la référence à n'importe qui qui est de traiter avec de grandes images bitmap il y a un article qui montrent comment est la meilleure façon de traiter ce genre de problèmes à éviter OutofMemory!
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
Espère que cela aide!
La
REQUIRED_SIZE
doit contenir au max de la dimension (largeur, hauteur en pixels) commeVous aussi raté quelques lignes pour obtenir de l'image limites
BitmapFactory.Options o
avant de calculer le facteur d'échelle.Ensuite utiliser
o.outWidth
eto.outHeight
pour calculer le facteur d'échelle. Vous pourriez avoir besoin de cherchercis
de nouveau pour le décodage du flux de données.Mise à jour:
Aussi, Vous pouvez rendre les variables suivantes en tant que membres de l'adaptateur et de l'initialiser dans le constructeur.
Cela devrait fonctionner sans problèmes.
Prises à partir d'ici:
http://www.memofy.com/memofy/show/1008ab7f2836ab7f01071c2dbfe138/outofmemory-exception-when-decoding-with-bitmapfactory
Essayez ceci:
Au lieu de:
Donc, avant d'utiliser BitmapFactory.decodeFile() crée un tableau d'octets de 16 ko et de le transmettre à la température de stockage dans les processus de décodage.
Espère que ça aide!
référence: Étrange, hors de question de la mémoire lors du chargement d'une image à un objet Bitmap
J'ai eu le même problème, encore et encore.
voilà mon code maby son alitle exagéré, mais j'ai eu à cette cause, de différentes de la caméra de la taille, de res, etc , mais vous aurez à ajuster à vos besoins.
Espère que cette aide
utiliser le recyclage(). Il sera libre le natif de l'objet associé à cette image, et de supprimer la référence pour les données de pixel.
Quelle version d'Android exécutez-vous ceci? Si vous l'exécutez sur Nid d'abeille ou plus, vous devriez être en mesure d'utiliser l'Éclipse de la mémoire de l'analyseur de voir où votre mémoire est de s'habituer.
Cela étant dit, vous devez faire appel à recycler() sur votre bitmap dès qu'ils ne sont plus nécessaires ou affiche (qui est le problème avec Sujits réponse). En d'autres termes, si une image Bitmap sort de l'écran, il serait préférable de recycler (), et puis de re-charger à nouveau quand il revient dans la vue. Sinon, l'image Bitmap est usi
Pour ce faire, appelez getDrawable() sur votre ImageView, appel setImageDrawable(null) sur votre ImageView, puis coulé le drawable à un BitmapDrawable et de recycler l'image bitmap à l'intérieur.
Pour plus d'informations sur comment bitmap en mémoire travaillé pré Android 3.0, vous pouvez voir un post que j'ai fait sur cette question: http://code.google.com/p/android/issues/detail?id=8488#c80