Как обрабатывать размер растрового изображения превышает ошибки в Android - PullRequest
0 голосов
/ 23 января 2012

Любой может помочь в том, как обрабатывать растровое изображение, превышающее ошибку VM Buget.На самом деле я отображал больше изображений в виде списка.Он работает нормально и выдает ошибку растрового изображения после повторного запуска упражнения. Любые ответы приветствуются от всего сердца.

Ответы [ 4 ]

2 голосов
/ 23 января 2012

Эти ссылки могут быть вам полезны.
http://android -developers.blogspot.com / 2009/01 / avoiding-memory-leaks.html
Также эта ссылка какпоказывает, как кто-то допускает простые, но радикальные ошибки при реализации списка / сетки, которые включают в себя загрузку изображений.
Как решить ошибку кучи памяти vm budget в отложенной загрузке растровых изображений?

Также, как вы сказали, проблема dis возникает при повторном вызове вашей активности, я подозреваю, что вы загружаете изображения в потоки, которые вы инициализируете в методе getView вашего адаптера.
Это обычное явление, которое я видел, люди реализуюти затем столкнитесь с подобной проблемой.
Если это то, что происходит в вашем коде, вам нужно проверить это снова, так как это приведет к генерации потоков для всех строк списка, для которых вызывается getView.

1 голос
/ 23 января 2012

public enum BitmapLoading {INSTANCE;

private final Map<String, SoftReference<Bitmap>> cache;
private final ExecutorService pool;
private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
private Bitmap placeholder;

BitmapLoading() {
    cache = new HashMap<String, SoftReference<Bitmap>>();
    pool = Executors.newFixedThreadPool(5);
}

public void setPlaceholder(Bitmap bmp) {
    try {
        placeholder = bmp;
    } catch (OutOfMemoryError e) {
        placeholder.recycle();
        bmp.recycle();
        placeholder = null;
        bmp = null;
    }
}

public Bitmap getBitmapFromCache(String url) {
    if (cache.containsKey(url)) {
        return cache.get(url).get();
    }
    return null;
}

public void queueJob(final String url, final ImageView imageView,final int width, final int height) {
    /* Create handler in UI thread. */
    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            String tag = imageViews.get(imageView);
            if (tag != null && tag.equals(url)) {
                if (msg.obj != null) {
                    imageView.setImageBitmap((Bitmap) msg.obj);
                } else {
                    imageView.setImageBitmap(placeholder);
                    Log.d(null, "fail " + url);
                }
            }
        }
    };
    pool.submit(new Runnable() {
        @Override
        public void run() {
            Bitmap bmp = null;
            try{
                bmp = downloadBitmap(url, width, height);
                Message message = Message.obtain();
                message.obj = bmp;
                handler.sendMessage(message);
            }catch (OutOfMemoryError e) {
                bmp.recycle();
                bmp = null;
            }
        }
    });
}

public void loadBitmap(final String url, final ImageView imageView,final int width, final int height) {
    imageViews.put(imageView, url);
    Bitmap bitmap = null ;
    try {
        bitmap = getBitmapFromCache(url);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            imageView.setImageBitmap(placeholder);
            queueJob(url, imageView, width, height);
        }
    } catch (OutOfMemoryError e) {
        bitmap.recycle();
        bitmap = null;
        System.gc();
    }
}

private Bitmap downloadBitmap(String url, int width, int height) {
    Bitmap bitmap =null;
    try {
        bitmap = BitmapFactory.decodeStream((InputStream) new URL(url).getContent());
        bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
        cache.put(url, new SoftReference<Bitmap>(bitmap));
        return bitmap;
    }catch (OutOfMemoryError e) {
        bitmap.recycle();
        bitmap = null;
        System.gc();
    } 
    catch (MalformedURLException e) {
    } catch (IOException e) {
    }
    return null;
}

}

0 голосов
/ 23 января 2012

На самом деле есть очень хороший пример того, как выполнить Ленивую загрузку в списке просмотра в этом проекте: Android Ленивая загрузка просмотра списка .

0 голосов
/ 23 января 2012

Для решения этой проблемы необходимо использовать концепцию отложенной загрузки или использовать концепцию мягких ссылок с растровым изображением.

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