De l'Erreur De Mémoire avec des images
je suis d'affichage des images dans listview et sortir de la mémoire d'erreur tout un guide-moi quelle est la solution à ce problème voici mon code
LogCat
ERROR/AndroidRuntime(1010): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
ERROR/AndroidRuntime(1010): at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
ERROR/AndroidRuntime(1010): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:405)
ERROR/AndroidRuntime(1010): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:418)
ERROR/AndroidRuntime(1010): at com.Adapters.AdapterTours.getView(AdapterTours.java:73)
ERROR/AndroidRuntime(1010): at android.widget.AbsListView.obtainView(AbsListView.java:1409)
ERROR/AndroidRuntime(1010): at android.widget.ListView.makeAndAddView(ListView.java:1745)
ERROR/AndroidRuntime(1010): at android.widget.ListView.fillUp(ListView.java:700)
ERROR/AndroidRuntime(1010): at android.widget.ListView.fillGap(ListView.java:646)
ERROR/AndroidRuntime(1010): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3399)
ERROR/AndroidRuntime(1010): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2233)
ERROR/AndroidRuntime(1010): at android.widget.ListView.onTouchEvent(ListView.java:3446)
ERROR/AndroidRuntime(1010): at android.view.View.dispatchTouchEvent(View.java:3885)
ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691)
ERROR/AndroidRuntime(1010): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125)
ERROR/AndroidRuntime(1010): at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
ERROR/AndroidRuntime(1010): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675)
ERROR/AndroidRuntime(1010): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194)
ERROR/AndroidRuntime(1010): at android.view.ViewRoot.handleMessage(ViewRoot.java:1878)
ERROR/AndroidRuntime(1010): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(1010): at android.os.Looper.loop(Looper.java:130)
ERROR/AndroidRuntime(1010): at android.app.ActivityThread.main(ActivityThread.java:3683)
ERROR/AndroidRuntime(1010): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(1010): at java.lang.reflect.Method.invoke(Method.java:507)
ERROR/AndroidRuntime(1010): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
ERROR/AndroidRuntime(1010): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
ERROR/AndroidRuntime(1010): at dalvik.system.NativeStart.main(Native Method)
Méthode GetView
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_tours, null);
holder = new ViewHolder();
holder.tourTitle = (TextView) convertView.findViewById(R.id.tourTitle);
holder.tourIcon = (ImageView) convertView.findViewById(R.id.tourIcon);
holder.tourDetail = (TextView) convertView.findViewById(R.id.tourDetail);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
DalTours tour = getItem(position);
String tempTag = String.valueOf(tour.getId());
holder.tourIcon.setTag(tempTag);
if(tour.getImageByteArray() != null)
{
Bitmap image = BitmapFactory.decodeByteArray(tour.getImageByteArray(), 0, tour.getImageByteArray().length);
holder.tourIcon.setImageDrawable(getScaledImage(image));
image = null;
}else
{
holder.tourIcon.setTag(tour);
Bitmap cachedImage = ImageLoader.loadBitmap(tour,new ImageLoader.ImageCallback() {
@Override
public void imageLoaded(Bitmap imageBitmap, DalTours tour) {
ImageView image = (ImageView)listview.findViewWithTag(tour);
if(image != null)
{
try
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
if(imageBitmap != null)
{
image.setImageDrawable(getScaledImage(imageBitmap));
imageBitmap.compress(CompressFormat.PNG, 0 ,stream);
byte[] bitmapdata = stream.toByteArray();
tours.get(position).setImageByteArray(bitmapdata);
}
stream = null;
}finally
{
}
}
}
});
holder.tourIcon.setImageDrawable(getScaledImage(cachedImage));
}
holder.tourTitle.setText(tours.get(position).getTitle());
holder.tourDetail.setText(tours.get(position).getDetail());
return convertView;
}
de l'image à l'Échelle de la Fonction
public Drawable getScaledImage(Bitmap actualBitmap)
{
BitmapDrawable bmd= null;
if(actualBitmap != null)
{
int width = actualBitmap.getWidth();
int height = actualBitmap.getHeight();
Activity parent = (Activity)context;
Display display = parent.getWindowManager().getDefaultDisplay();
int Screenwidth = display.getWidth();
int Screenheight = display.getHeight();
float newWidth = (Screenwidth*35)/100;
float temp = newWidth / width;
float newHeight = temp * height;
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(actualBitmap, 0, 0,
width, height, matrix, true);
bmd = new BitmapDrawable(resizedBitmap);
}
return bmd;
}
Image De La Classe Loader
public class ImageLoader {
private static HashMap<String, SoftReference<Bitmap>> imageCache;
public ImageLoader() {
//imageCache = new HashMap<String, SoftReference<Bitmap>>();
}
public static Bitmap loadBitmap(final DalTours tour, final ImageCallback imageCallback) {
if(imageCache == null)
imageCache = new HashMap<String, SoftReference<Bitmap>>();
if (imageCache.containsKey(tour.getImageurl())) {
SoftReference<Bitmap> softReference = imageCache.get(tour.getImageurl());
Bitmap Bitmap = softReference.get();
if (Bitmap != null) {
return Bitmap;
}
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
imageCallback.imageLoaded((Bitmap) message.obj, tour);
}
};
new Thread() {
@Override
public void run() {
Bitmap Bitmap = loadImageFromUrl(tour.getImageurl());
imageCache.put(tour.getImageurl(), new SoftReference<Bitmap>(Bitmap));
Message message = handler.obtainMessage(0, Bitmap);
handler.sendMessage(message);
}
}.start();
return null;
}
public static Bitmap loadImageFromUrl(String url) {
Bitmap bm;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = null;
try
{
is= conn.getInputStream();
}catch(IOException e)
{
return null;
}
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
return null;
}
return bm;
}
public interface ImageCallback {
public void imageLoaded(Bitmap imageBitmap, DalTours tour);
}
}
toute aide serait apprecicated
l'image que j'utilise est très grand
Est-ce le code de Fedor du Chargement différé des images? stackoverflow.com/questions/541966/...
chrysler-contents.g1curator.com/1313185770.jpg
non, je suis en utilisant le code de ce site...blog.dutchworks.nl/2009/09/17/...
Est-ce le code de Fedor du Chargement différé des images? stackoverflow.com/questions/541966/...
chrysler-contents.g1curator.com/1313185770.jpg
non, je suis en utilisant le code de ce site...blog.dutchworks.nl/2009/09/17/...
OriginalL'auteur UMAR | 2011-10-12
Vous devez vous connecter pour publier un commentaire.
Pour la Résolution de java.lang.OutOfMemoryError Exception à android.les graphiques.BitmapFactory.nativeDecodeByteArray, vous devriez utiliser le Code Suivant:
inPurgeable
est obsolète, il semble que pour des versions plus récentes.Je vous remercie beaucoup. ce code est travaillé pour moi.
À partir de developer.android.com/reference/android/graphics/... : inPurgeable est obsolète.... la plupart des applications doivent éviter d'utiliser inPurgeable afin de permettre une rapide et fluide de l'INTERFACE utilisateur. Afin de minimiser Dalvik tas allocations utiliser le inBitmap drapeau à la place.
OriginalL'auteur Jigar
enfin je résoudre cette image en haute résolution problème qui a été la cause de l'erreur de mémoire à l'aide de fil de discussion suivant
Image Grand Manipulation
et voici mon code pour le téléchargement et la mise à l'échelle de l'image en fonction de votre taille requise.
plus aucune mise à l'échelle personnalisée fonction requise!!!
OriginalL'auteur UMAR
vous avez à
recycle
bitmap. L'image bitmap de la mise en œuvre est originaire, de sorte que l'objet java est petit et un mauvais candidat pour java la collecte des ordures, mais le souvenir est toujours allouée. Taka un coup d'oeil àBitmap.recycle()
okey... pour commencer.. règle générale: Chaque fois que vous n'avez pas besoin de l'objet bitmap, appel Bitmap.recycler. Dans votre code: dans getScaledImage après la création de la dmo, resizedBitmap et actualBitmap ne sont plus nécessaires.. donc appel resizedBitmap.recycler() et actualBitmap.le recyclage(). Utilisation softreference pour obtenir une image mémoire cache de l'omi n'est pas une bonne idée (pour le bitmap natif de mise en œuvre)
OriginalL'auteur Blackbelt
Il est certainement d'avoir une image bitmap pour une grande image dans la mémoire. Si vous êtes à plusieurs reprises de faire cette opération, il est bon de recycler l'image bitmap à chaque fois. Cependant, il suffit de recyclage ne garantit pas que la mémoire est libérée, sa peine marqué pour la collecte des ordures. Donc, comme une étape supplémentaire, vous devez prendre soin de la collecte des ordures.
Utiliser ce code;
OriginalL'auteur codeFood