批量图像下载的OutOfMemoryError

时间:2011-10-24 20:05:09

标签: android android-asynctask drawable

我有一个很大的对象列表,所有人都有自己的图像路径“ex。http://www.google.com/image.jpg”,我需要下载图像并将drawable保存到对象中。

我正在使用AsyncTask,但即使我使用自己的线程,我总是在列表中的某个任意点处得到'OutOfMemoryError'。这些图像的大小永远不会超过82Kb(这对Android平板电脑来说太大了吗?),但我认为图像的绝对数量导致整个过程失败。

这是我目前正在做的事情。

class DownloadImageTask extends AsyncTask<ArrayList<Item>, Void, Void> {

private static int num =1;

@Override

protected Void doInBackground(ArrayList<Item>... items) {

    try {

        if(items.length == 0)

            return null;

        HttpURLConnection connection;

        InputStream input;

        for(ArrayList<Item> itemlist : items) {

            for(Item i : itemlist) {

                Log.d(JusTouchMenu.TAG,"[Item]Image request to url:"+i.getImagePath());

                try {

                    connection = (HttpURLConnection)new URL(i.getImagePath()).openConnection();

                    connection.setRequestProperty("User-agent","Mozilla/4.0");

                    connection.connect();

                    input = connection.getInputStream();

                    i.setImage(new BitmapDrawable(BitmapFactory.decodeStream(input)));//Requires a drawable

                    connection.disconnect();

                } catch(Exception e) {Log.e(JusTouchMenu.TAG,"[Item]Unable to download image @ '"+i.getImagePath()+"'",e);}

                Log.v(JusTouchMenu.TAG, "[Item]Image decoded @ '"+i.getImagePath()+"' #"+num++);

                for(Tag pt : i.tags()) {

                    Log.d(JusTouchMenu.TAG,"[Item->Tag]Image request to url:"+pt.getImagePath());

                    try {

                        connection = (HttpURLConnection)new URL(pt.getImagePath()).openConnection();

                        connection.setRequestProperty("User-agent","Mozilla/4.0");

                        connection.connect();

                        input = connection.getInputStream();

                        pt.setImage(new BitmapDrawable(BitmapFactory.decodeStream(input))); //Requires a drawable

                        connection.disconnect();

                    } catch(Exception e) {

                        Log.e(JusTouchMenu.TAG,"[Item->Tag]Unable to download image @ '"+i.getImagePath()+"'",e);

                    }

                    Log.v(JusTouchMenu.TAG, "[Item->Tag]Image decoded @ '"+pt.getImagePath()+"' #"+num++);

                }

            }

        }

    } catch(Exception e) {

        Log.e(JusTouchMenu.TAG,"Error decoding image inside AsyncTask",e);

    }

    return null;

}

谢谢!

1 个答案:

答案 0 :(得分:0)

您想要立刻获得多少这些图片?你是怎么用它们的?

您应该考虑使用Gallery或GridView的功能,从而只加载目前处于视图中的图像。你甚至可以得到它们的想象力并缓存它们,因此滚动很顺畅。当你不可能一次性显示所有图像时,尝试将所有图像加载到ArrayList中并不是一种移动友好的方法。

以下是对缓存方法的一些不错的参考,但您可能应该根据需要开始使用基本库或网格视图加载,然后添加缓存。

Lazy load of images in ListView

http://code.google.com/p/libs-for-android/wiki/ImageLoader