De l'Erreur de Mémoire ImageView problème
Je suis nouveau dans la programmation Android et j'ai une erreur qui me dit que mon app exécuter de mémoire, ce exampled j'ai copié à partir d'un livre et c'est en travaillant avec de petites images de résolution, mais quand j'ai ajouté quelques photos avec une plus grande résolution de l'erreur de mémoire apparaît, peut-être que je fais quelque chose de mal ou tout simplement ne savent pas tout ce que je doit encore travailler avec des images, si quelqu'un sait ce que je devrais changer pour que cette erreur n'apparaît pas encore, des moyens de les aider. Merci à vous d'anticiper!
Le code source:
public class ImageViewsActivity extends Activity {
//the images to display
Integer[] imageIDs={
R.drawable.pic1,
R.drawable.pic2,
R.drawable.pic3,
R.drawable.pic4,
R.drawable.pic5
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView iv=(ImageView) findViewById(R.id.image1);
Gallery gallery=(Gallery) findViewById(R.id.gallery);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View v, int position, long id){
Toast.makeText(getBaseContext(), "pic"+(position+1)+" selected", Toast.LENGTH_SHORT).show();
//display the image selected
try{iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
iv.setImageResource(imageIDs[position]);}catch(OutOfMemoryError e){
iv.setImageBitmap(null);
}
}
});
}
public class ImageAdapter extends BaseAdapter{
private Context context;
private int itemBackground;
public ImageAdapter(Context c){
context=c;
//setting the style
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
itemBackground = a.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0);
a.recycle();
}
//returns the number of images
public int getCount() {
//TODO Auto-generated method stub
return imageIDs.length;
}
//returns the ID of an item
public Object getItem(int position) {
//TODO Auto-generated method stub
return position;
}
//returns the ID of an item
public long getItemId(int position) {
//TODO Auto-generated method stub
return position;
}
//returns an ImageView view
public View getView(int position, View convertView, ViewGroup parent) {
//TODO Auto-generated method stub
ImageView iv= new ImageView(context);
iv.setImageResource(imageIDs[position]);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setLayoutParams(new Gallery.LayoutParams(150,120));
iv.setBackgroundResource(itemBackground);
return iv;
}
}}
ERREUR ICI:
04-18 10:38:31.661: D/dalvikvm(10152): Debugger has detached; object registry had 442 entries
04-18 10:38:31.661: D/AndroidRuntime(10152): Shutting down VM
04-18 10:38:31.661: W/dalvikvm(10152): threadid=1: thread exiting with uncaught exception (group=0x4001d820)
04-18 10:38:31.691: E/AndroidRuntime(10152): FATAL EXCEPTION: main
04-18 10:38:31.691: E/AndroidRuntime(10152): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.Bitmap.nativeCreate(Native Method)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.Bitmap.createBitmap(Bitmap.java:499)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.Bitmap.createBitmap(Bitmap.java:466)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:371)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:539)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:508)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:365)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:728)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.content.res.Resources.loadDrawable(Resources.java:1740)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.content.res.Resources.getDrawable(Resources.java:612)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.widget.ImageView.resolveUri(ImageView.java:520)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.widget.ImageView.setImageResource(ImageView.java:305)
04-18 10:38:31.691: E/AndroidRuntime(10152): at image.view.GalleryView$ImageAdapter.getView(GalleryView.java:95)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.widget.Gallery.makeAndAddView(Gallery.java:776)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.widget.Gallery.fillToGalleryLeft(Gallery.java:695)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.widget.Gallery.trackMotionScroll(Gallery.java:406)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.widget.Gallery$FlingRunnable.run(Gallery.java:1397)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.os.Handler.handleCallback(Handler.java:618)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.os.Handler.dispatchMessage(Handler.java:123)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.os.Looper.loop(Looper.java:154)
04-18 10:38:31.691: E/AndroidRuntime(10152): at android.app.ActivityThread.main(ActivityThread.java:4668)
04-18 10:38:31.691: E/AndroidRuntime(10152): at java.lang.reflect.Method.invokeNative(Native Method)
04-18 10:38:31.691: E/AndroidRuntime(10152): at java.lang.reflect.Method.invoke(Method.java:552)
04-18 10:38:31.691: E/AndroidRuntime(10152): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:917)
04-18 10:38:31.691: E/AndroidRuntime(10152): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
04-18 10:38:31.691: E/AndroidRuntime(10152): at dalvik.system.NativeStart.main(Native Method)
- Merci de poster l'ensemble de la stacktrace associé à l'erreur
- a) ne pas utiliser de grandes images, ou b) de réduire la résolution des images lors de l'exécution de réduire l'utilisation de la mémoire. Vous montrez seulement 150x120 pixel versions si je ur obtenir le code de droit.
- De la mémoire est un gros problème lors de l'affichage des images. Vérifiez ce tutoriel ici: Affichage des images de manière Efficace
- cela fonctionne pour moi: stackoverflow.com/questions/11543326/...
- j'ai connu le même problème. Dans mon cas, le problème des causes en raison de la grande taille de l'image. Donc quand je l'appelle setImageResource(), le dépassement de mémoire erreur se produit.
Vous devez vous connecter pour publier un commentaire.
À ajouter sur Ken de réponse, qui est un morceau de code, j'ai pensé que j'allais le frapper vers le bas après il mis en place:
REMARQUE: Cela ne fonctionnera pas si vous essayez de remplacer une image vous déjà recyclés. Vous obtiendrez quelque chose comme ceci dans le LOGCAT
Donc ce que je fais maintenant, si je n'ai pas à charger un tas de différentes images de manière asynchrone, il me suffit de mettre ceci dans le onDestroy lorsque vous traitez avec des fragments et de grandes images d'arrière-plan:
setIMageDrawable(null)
) dans onDestroyView() ?onDestroyView()
est le meilleur endroit, étant donné le déjantéFragment
cycle de vie. Vous auriez certainement envie de le faire que si vous étiez à l'aide d'unFragment
s dans unViewPager
.Utilisation
Avant de changer à nouveau de l'image!!
Pour ceux qui utilisent le Glisse image de chargement de la bibliothèque, qui sont toujours en cours d'exécution dans ces
OutOfMemory Exception
questions, il y a beaucoup de choses que vous pouvez faire pour rendreGlide
utiliser moins de mémoire et nous espérons résoudre votre problème. Voici quelques-uns d'entre eux:Ne pas utiliser
android:scaleType="fitXY"
à l'intérieur de votreImageView
. Donc, si vous êtesImageView
ressemble à ceci:Changer le
ImageView
utiliser un autreandroid:scaleType
, de préférence:fitCenter
oucenterCrop
.wrap_content
dans votreImageView
, au lieu d'utilisermatch_parent
ou spécifier lewidth
/height
explicitement en utilisant une taille endp
. Si vous vraiment insister sur l'utilisation dewrap_content
dans votreImageView
, au moins unandroid:maxHeight
/android:maxWidth
.dontAnimate()
sur votreGlide.with()...
demande.Si vous êtes en train de charger beaucoup de potentiellement des images de grande taille (comme vous le feriez dans une liste/grille), spécifiez un
thumbnail(float sizeMultiplier)
charge de votre demande. Ex:Abaisser temporairement
Glide
's de la mémoire au cours de certaines phases de votre application en utilisant:Glide.get(context).setMemoryCategory(MemoryCategory.LOW)
.skipMemoryCache(true)
sur votreGlide.with()...
demande. Ce sera toujours de mettre en cache les images sur le disque, qui vous aurez probablement envie depuis que vous êtes qui précède, le cache en mémoire.Drawable
de vos ressources locales, assurez-vous que l'image que vous essayez de charger N'est PAS SUPER ÉNORME. Il y a beaucoup de compression de l'image outils disponibles en ligne. Ces outils permettront de réduire la taille de vos images tout en conservant leur qualité de finition..diskCacheStrategy(DiskCacheStrategy.NONE)
.Crochet dans le
onTrimMemory(int level)
rappel que Android fournit à couper leGlide
cache en tant que de besoin. Ex.Si l'affichage des images dans un
RecyclerView
vous pouvez explicitement clairGlide
lorsque les vues sont recyclés, comme suit:Glide
est un peu la seule chose qui pousse à laOutOfMemory Exception
zone... Donc, assurez-vous que vous n'avez pas de fuites de mémoire dans votre application.Android Studio
fournit des outils pour identifier les problèmes de consommation de mémoire dans votre application.Picasso
il nécessite trop de mémoire. Donc, je n'ai queGlide
conseils. Mais certains de ces conseils peut être utilisé avecPicasso
ainsi.onDestroy()
(ou quelque trait de rappel). Similaire à la façon dont vous devriez explicitement l'affichage de l'image dansonViewRecycled()
.Source: Le Chargement D'Un Grand Bitmaps Efficacement
Sur la base des informations ci-dessus, je vous recommande plutôt de la définition de l'image comme ceci:
le configurer comme ceci:
et Copier & Coller les méthodes ci-dessous:
Google a le droit (parfait) réponse:
https://developer.android.com/training/displaying-bitmaps/load-bitmap.html
Un exemple de la manière dont je l'utilise en fragments:
J'ai mis ces Google méthodes à mes "Méthodes" de la classe (pour toutes les autres méthodes utiles):
Vous pouvez le laisser à la 3e partie des bibliothèques comme Glisse
Voici comment l'ajouter à votre
build.gradle
:Place Picasso est-il trop Picasso charge drawable les ressources de leurs URI
Glide
&Picasso
) peut encore fonctionner dansOOM
exceptions... Ils ne sont pas les balles d'argent qui sont imperméables à des erreurs.OutOfMemory
questions, même avec l'utilisation deGlide
, voir ma réponse pour quelques conseils pour vous aider à le résoudre.Notes supplémentaires à @Sakiboy réponse.
Même si je suis probablement trop tard pour ma réponse, mais voici ma solution j'ai trouvé ça fonctionne sans avoir besoin de faire beaucoup de changements dans le code.
Glide
pour gérer l'ensemble de la mise en cache.views
et définissezImageView
bitmap/drawable ànull
et clair de tous les gestionnaires d'événements et les auditeurs.activity
oufragment
ànull
.onDestroy
et vous devriez être bon d'aller.System.gc()
à la fin de votre code.Après effacement de toutes les choses que j'ai mentionnées. Vous remarquerez que la mémoire va aller vers le bas à chaque fois qu'un fragment/activité est détruite.
J'ai eu le même problème quand j'étais en montrant des images de Grande taille dans imageview en mode PAYSAGE.
je me suis donc résolu à l'aide de ce code