OutOfMemoryError при загрузке пакетного изображения - PullRequest
1 голос
/ 25 октября 2011

У меня есть большой список объектов, у каждого из которых есть путь к их изображению "ex. http://www.google.com/image.jpg", и мне нужно загрузить изображение и сохранить нарисованное для объекта ..

Я использовал AsyncTask, но даже если я использую свои собственные потоки, я всегда получаю 'OutOfMemoryError' в некоторой произвольной точке списка. Размеры изображений никогда не превышают 82 КБ (это слишком велико для планшетов 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 голосов
/ 25 октября 2011

Сколько из этих изображений вы пытаетесь получить одновременно?Как вы их используете?

Вам, вероятно, следует рассмотреть возможность использования возможностей Gallery или GridView и тем самым загружать только те изображения, которые видны в данный момент.Вы даже можете придумывать и кэшировать их, чтобы прокрутка была удобной и плавной.Попытка загрузить все изображения в ArrayList, когда вы вряд ли сможете отобразить их все одновременно, не подходит для мобильных устройств.

Вот несколько достойных ссылок на подходы кеширования, но вам, вероятно, стоит начатьс базовой загрузкой галереи или вида сетки при необходимости, а затем добавьте кэширование.

Ленивая загрузка изображений в ListView

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...