获取异常OutofMemoryError [英] Getting an exception OutofMemoryError

查看:118
本文介绍了获取异常OutofMemoryError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



这是他得到的错误,我有一个人在我的应用程序中加载一堆图像时出现错误,我不知道是什么导致的。
LINE 135在底部。

我在想他的手机内存不足。他正在使用2010年制作的Desire HD。这种方法是从服务器获取图像并将其保存在哈希映射中。随着显示在屏幕上。关于我如何防止这个OUTMEMORYERROR的任何想法?



我正在考虑设置一个计数器,只要清除散列图,如果有超过20张图像。



Logcat:

  java.lang.RuntimeException:执行doInBackground()时发生错误
在android.os.AsyncTask $ 3.done(AsyncTask.java:200)
在java.util.concurrent.FutureTask $ Sync.innerSetException(FutureTask.java:274)
在java.util.concurrent.FutureTask.setException(FutureTask。 JavaButton.Run( $ b在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:581)
在java.lang .Thread.run(Thread.java:1019)
导致:java.lang.OutOfMemoryError:位图大小超过VM预算
在android.graphics.BitmapFactory.nativeDecodeStream(本机方法)
在android.graphics.Bitmap Factory.decodeStream(BitmapFactory.java:470)
在android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
at com.codalata.craigslistchecker.GETTHEIMAGE $ ITask.doInBackground(GETTHEIMAGE.java:135)
at com .codalata.craigslistchecker.GETTHEIMAGE $ ITask.doInBackground(GETTHEIMAGE.java:1)
在android.os.AsyncTask $ 2.call(AsyncTask.java:185)
在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:306)

代码:

  public class GETTHEIMAGE {

private HashMap< String,Drawable> ICACHE;
private static Drawable DefIcon = null;
私人BaseAdapter适应;
私人ItemView项目;
private int num = 0;

public GETTHEIMAGE(Context c){
ICache = new HashMap< String,Drawable>();
}

public Drawable GetTheImagedata(
com.codalata.craigslistchecker.Favorites.TheListAdapter theListAdapter,
ImageView ICON_IMG){
this.adapt = theListAdapter;
String url =(String)ICON_IMG.getTag();
if(ICache.containsKey(url)){
return ICache.get(url);
} else {
new ITask()。execute(url);
返回DefIcon;
}
}

public Drawable GetTheImagedata(TheListAdapter适配器,ImageView ICON_IMG){
this.adapt = adapter;
String url =(String)ICON_IMG.getTag();
if(ICache.containsKey(url)){
return ICache.get(url);
} else {
new ITask()。execute(url);
返回DefIcon;
}
}

public Drawable GetTheImagedata2(ItemView itemView,String string){
this.item = itemView;
String url = string;
if(ICache.containsKey(url)){
return ICache.get(url);
} else {
new ITask2()。execute(url);
返回DefIcon;
}
}

私有类ITask2扩展AsyncTask< String,Void,Drawable> {
private String Nick;

@Override
protected Drawable doInBackground(String ... params){
Nick = params [0];
InputStream isImage = null;
try {
URL url = new URL(Nick);
isImage = url.openStream();
} catch(MalformedURLException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
return Drawable.createFromStream(isImage,Nick);
}

@Override
protected void onPostExecute(Drawable result){
super.onPostExecute(result);
if(num == 0){
item.ivItemimage1.setImageDrawable(result);
}
if(num == 1){
item.ivItemimage2.setImageDrawable(result);
}
if(num == 2){
item.ivItemimage3.setImageDrawable(result);
}
if(num == 3){
item.ivItemimage4.setImageDrawable(result);
}
if(num == 4){
item.ivItemimage5.setImageDrawable(result);
}
if(num == 5){
item.ivItemimage6.setImageDrawable(result);
}
if(num == 6){
item.ivItemimage7.setImageDrawable(result);
}
if(num == 7){
item.ivItemimage8.setImageDrawable(result);
}
if(num == 8){
item.ivItemimage9.setImageDrawable(result);
}
if(num == 9){
item.ivItemimage10.setImageDrawable(result);
}
num ++;
}
}

私有类ITask扩展AsyncTask< String,Void,Drawable> {
private String Nick;

@Override
protected Drawable doInBackground(String ... params){
Nick = params [0];
InputStream isImage = null;
try {
URL url = new URL(Nick);
isImage = url.openStream();
} catch(MalformedURLException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
try {
LINE 135 -----> return Drawable.createFromStream(isImage,Nick);
} catch(Exception e){
e.printStackTrace();
}
返回null;
}

@Override
protected void onPostExecute(Drawable result){
super.onPostExecute(result);
synchronized(this){
ICache.put(Nick,result);
}
adapt.notifyDataSetChanged();
}
}
}


解决方案

您需要缩小位图,并在内存中加载缩小版本。



http://developer.android.com/training/displaying-bitmaps/load-bitmap.html



< .graphics.BitmapFactory.Options%29rel =nofollow noreferrer>根据需要使用适当的 BitmapFactory.decode 方法



以下是一个示例:



Bitmap的内存不足错误



注意:从Android 3.0(API 11级)开始,像素数据与相关联的b一起存储在Dalvik堆上itmap。



在Android 2.3.3(API级别10)以上,使用 recycle()被推荐。如果您在应用程序中显示大量位图数据,则可能会遇到OutOfMemoryError错误。 recycle()方法允许应用程序尽快回收内存。



Android 3.0(API Level 11)引入了 BitmapFactory.Options。 inBitmap 字段。如果设置了此选项,则使用选项对象的解码方法将尝试在加载内容时重用现有位图。这意味着位图的内存被重复使用,从而提高性能,并且同时移除内存分配和解除分配。



http://developer.android.com/training/displaying-bitmaps/manage-memory.html


I have someone getting an error while loading a bunch of images on my app and I'm not sure whats causing it.

This is the error he gets. LINE 135 is at the bottom.
I'm thinking he is running out of memory on his phone. He is using a Desire HD which was made in 2010. What this method does is get an image from the server and keep it in a hash map. Along with displaying it onto the screen. Any ideas on how I could prevent this OUTMEMORYERROR?

I was thinking setting up a counter that just clears the hash map if there are over 20 images.

Logcat:

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
at com.codalata.craigslistchecker.GETTHEIMAGE$ITask.doInBackground(GETTHEIMAGE.java:135)
at com.codalata.craigslistchecker.GETTHEIMAGE$ITask.doInBackground(GETTHEIMAGE.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

Code:

 public class GETTHEIMAGE {

private HashMap<String, Drawable> ICache;
private static Drawable DefIcon = null;
private BaseAdapter adapt;
private ItemView item;
private int num = 0;

public GETTHEIMAGE(Context c) {
    ICache = new HashMap<String, Drawable>();
}

public Drawable GetTheImagedata(
        com.codalata.craigslistchecker.Favorites.TheListAdapter theListAdapter,
        ImageView ICON_IMG) {
    this.adapt = theListAdapter;
    String url = (String) ICON_IMG.getTag();
    if (ICache.containsKey(url)) {
        return ICache.get(url);
    } else {
        new ITask().execute(url);
        return DefIcon;
    }
}

public Drawable GetTheImagedata(TheListAdapter adapter, ImageView ICON_IMG) {
    this.adapt = adapter;
    String url = (String) ICON_IMG.getTag();
    if (ICache.containsKey(url)) {
        return ICache.get(url);
    } else {
        new ITask().execute(url);
        return DefIcon;
    }
}

public Drawable GetTheImagedata2(ItemView itemView, String string) {
    this.item = itemView;
    String url = string;
    if (ICache.containsKey(url)) {
        return ICache.get(url);
    } else {
        new ITask2().execute(url);
        return DefIcon;
    }
}

private class ITask2 extends AsyncTask<String, Void, Drawable> {
    private String Nick;

    @Override
    protected Drawable doInBackground(String... params) {
        Nick = params[0];
        InputStream isImage = null;
        try {
            URL url = new URL(Nick);
            isImage = url.openStream();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Drawable.createFromStream(isImage, "Nick");
    }

    @Override
    protected void onPostExecute(Drawable result) {
        super.onPostExecute(result);
        if (num == 0) {
            item.ivItemimage1.setImageDrawable(result);
        }
        if (num == 1) {
            item.ivItemimage2.setImageDrawable(result);
        }
        if (num == 2) {
            item.ivItemimage3.setImageDrawable(result);
        }
        if (num == 3) {
            item.ivItemimage4.setImageDrawable(result);
        }
        if (num == 4) {
            item.ivItemimage5.setImageDrawable(result);
        }
        if (num == 5) {
            item.ivItemimage6.setImageDrawable(result);
        }
        if (num == 6) {
            item.ivItemimage7.setImageDrawable(result);
        }
        if (num == 7) {
            item.ivItemimage8.setImageDrawable(result);
        }
        if (num == 8) {
            item.ivItemimage9.setImageDrawable(result);
        }
        if (num == 9) {
            item.ivItemimage10.setImageDrawable(result);
        }
        num++;
    }
}

private class ITask extends AsyncTask<String, Void, Drawable> {
    private String Nick;

    @Override
    protected Drawable doInBackground(String... params) {
        Nick = params[0];
        InputStream isImage = null;
        try {
            URL url = new URL(Nick);
            isImage = url.openStream();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try{
 LINE 135 ----->            return Drawable.createFromStream(isImage, "Nick");
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Drawable result) {
        super.onPostExecute(result);
        synchronized (this) {
            ICache.put(Nick, result);
        }
        adapt.notifyDataSetChanged();
    }
}
 }

解决方案

You need to scale down the bitmaps and load a scaled down version in memory.

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Use appropriateBitmapFactory.decode method as needed.

Here's an Example:

Out of Memory error with Bitmap

Note: As of Android 3.0 (API Level 11), the pixel data is stored on the Dalvik heap along with the associated bitmap.

On Android 2.3.3 (API level 10) and lower, using recycle() is recommended. If you're displaying large amounts of bitmap data in your app, you're likely to run into OutOfMemoryError errors. The recycle() method allows an app to reclaim memory as soon as possible.

Android 3.0 (API Level 11) introduces theBitmapFactory.Options.inBitmap field. If this option is set, decode methods that take the Options object will attempt to reuse an existing bitmap when loading content. This means that the bitmap's memory is reused, resulting in improved performance, and removing both memory allocation and de-allocation.

http://developer.android.com/training/displaying-bitmaps/manage-memory.html

这篇关于获取异常OutofMemoryError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆