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

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

问题描述

我有一个人得到一个错误,同时加载了一堆我的应用程序图像,我不知道什么导致它。

这是他得到的错误。 线135是在底部。
我想,他是在他的手机上运行内存不足。他是用这是在2010年。这是什么方法做的是从服务器获取的图像,并保存在一个哈希映射中的Desire HD的。随着它显示在屏幕上。我如何能prevent这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.java:125)
在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:308)
在java.util.concurrent.FutureTask.run(FutureTask.java:138)
在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.nativeDe codeStream(本机方法)
在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:470)
在android.graphics.BitmapFactory.de codeResourceStream(BitmapFactory.java:336)
在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
在android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
在com.codalata.craigslistchecker.GETTHEIMAGE $ ITask.doInBackground(GETTHEIMAGE.java:135)
在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)
 

code:

 公共类GETTHEIMAGE {

私人的HashMap<字符串,可绘制> ICACHE;
私有静态绘制对象DefIcon = NULL;
私人BaseAdapter适应;
私人ItemView控件项目;
私人INT NUM = 0;

公共GETTHEIMAGE(上下文C){
    ICACHE =新的HashMap<字符串,可绘制>();
}

公众可绘制GetTheImagedata(
        com.codalata.craigslistchecker.Favorites.TheListAdapter theListAdapter,
        ImageView的ICON_IM​​G){
    this.adapt = theListAdapter;
    字符串URL =(字符串)ICON_IM​​G.getTag();
    如果(ICache.containsKey(URL)){
        返回ICache.get(URL);
    } 其他 {
        新ITask()执行(URL);
        返回DefIcon;
    }
}

公众可绘制GetTheImagedata(TheListAdapter适配器,ImageView的ICON_IM​​G){
    this.adapt =适配器;
    字符串URL =(字符串)ICON_IM​​G.getTag();
    如果(ICache.containsKey(URL)){
        返回ICache.get(URL);
    } 其他 {
        新ITask()执行(URL);
        返回DefIcon;
    }
}

公众可绘制GetTheImagedata2(ItemView控件ItemView控件,串串){
    this.item = ItemView控件;
    字符串URL =串;
    如果(ICache.containsKey(URL)){
        返回ICache.get(URL);
    } 其他 {
        新ITask2()执行(URL);
        返回DefIcon;
    }
}

私有类ITask2扩展的AsyncTask<字符串,太虚,可绘制> {
    私人字符串尼克;

    @覆盖
    受保护的可绘制doInBackground(字符串... PARAMS){
        尼克= PARAMS [0];
        InputStream的isImage = NULL;
        尝试 {
            网址URL =新的URL(尼克);
            isImage = url.openStream();
        }赶上(MalformedURLException异常E){
            e.printStackTrace();
        }赶上(IOException异常E){
            e.printStackTrace();
        }
        返回Drawable.createFromStream(isImage,尼克);
    }

    @覆盖
    保护无效onPostExecute(可绘制的结果){
        super.onPostExecute(结果);
        如果(NUM == 0){
            item.ivItemimage1.setImageDrawable(结果);
        }
        如果(NUM == 1){
            item.ivItemimage2.setImageDrawable(结果);
        }
        如果(NUM == 2){
            item.ivItemimage3.setImageDrawable(结果);
        }
        如果(NUM == 3){
            item.ivItemimage4.setImageDrawable(结果);
        }
        如果(NUM == 4){
            item.ivItemimage5.setImageDrawable(结果);
        }
        如果(NUM == 5){
            item.ivItemimage6.setImageDrawable(结果);
        }
        如果(NUM == 6){
            item.ivItemimage7.setImageDrawable(结果);
        }
        如果(NUM == 7){
            item.ivItemimage8.setImageDrawable(结果);
        }
        如果(NUM == 8){
            item.ivItemimage9.setImageDrawable(结果);
        }
        如果(NUM == 9){
            item.ivItemimage10.setImageDrawable(结果);
        }
        NUM ++;
    }
}

私有类ITask扩展的AsyncTask<字符串,太虚,可绘制> {
    私人字符串尼克;

    @覆盖
    受保护的可绘制doInBackground(字符串... PARAMS){
        尼克= PARAMS [0];
        InputStream的isImage = NULL;
        尝试 {
            网址URL =新的URL(尼克);
            isImage = url.openStream();
        }赶上(MalformedURLException异常E){
            e.printStackTrace();
        }赶上(IOException异常E){
            e.printStackTrace();
        }
        尝试{
 LINE 135 ----->返回Drawable.createFromStream(isImage,尼克);
        }赶上(例外五){
            e.printStackTrace();
        }
        返回null;
    }

    @覆盖
    保护无效onPostExecute(可绘制的结果){
        super.onPostExecute(结果);
        同步(本){
            ICache.put(尼克,结果);
        }
        adapt.notifyDataSetChanged();
    }
}
 }
 

解决方案

您需要缩小的位图和加载一个缩小版在内存中。

http://developer.android.com/training/displaying-位图/负载bitmap.html

<一个href="http://developer.android.com/reference/android/graphics/BitmapFactory.html#de$c$cByteArray%28byte%5B%5D,%20int,%20int,%20android.graphics.BitmapFactory.Options%29"相对=nofollow>使用适当的 BitmapFactory.de code 方法需要的。

下面是一个例子:

<一个href="http://stackoverflow.com/questions/16765899/out-of-memory-error-with-bitmap/16766123#16766123">Out内存错误与位图的

注:作为的Andr​​oid 3.0(API等级11),像素数据存储在Dalvik的堆以及相关的位图

在Android 2.3.3(API等级10)和较低的,使用循环()建议。如果你在应用程序中显示大量的位图数据,你可能碰到的OutOfMemoryError错误。再循环()方法允许一个应用程序,以尽快回收内存。

的Andr​​oid 3.0(API等级11)推出 BitmapFactory.Options.inBitmap 字段。如果设置了此选项,即把选择对象将尝试下载内容时,重用现有的位图德code的方法。这意味着,该位图的存储器被重复使用,从而改进了性能,并除去两个存储器分配和解除分配。

http://developer.android.com/training/displaying-位图/管理-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天全站免登陆