Как я могу оптимизировать использование памяти с большим количеством растровых изображений? - PullRequest
0 голосов
/ 29 июля 2011

Я работаю над приложением, которое потенциально может загружать множество растровых изображений в ScrollView. Однако в определенный момент будет просто слишком много растровых изображений, и приложение вылетит с ошибкой «Недостаточно памяти». Я использую опцию largeHeap в Honeycomb.

Возможно ли как-то еще увеличить размер кучи или, возможно, использовать OpenGL для решения этой проблемы? Спасибо.

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Казалось, что не было никакого способа уменьшить объем памяти, используемый растровыми изображениями ARGB888, поэтому я решил использовать представление галереи вместо ScrollView.Это намного лучше для управления памятью.Для тех из вас, кто интересуется, почему я не просто пошел вперед и сделал это в первую очередь - ну, на мой взгляд, ScrollView выглядит круче, и мне не очень нравится выравнивание по центру всего вида галереи, но ябуду жить с этим.Спасибо!

1 голос
/ 29 июля 2011

Может решить проблему, загрузив изображения асинхронно

Используйте этот код для установки изображений

AsyncImageLoaderv asyncImageLoaderv=new AsyncImageLoaderv();
Bitmap cachedImage = asyncImageLoaderv.loadDrawable(imgurl, new AsyncImageLoaderv.ImageCallback() 
{
public void imageLoaded(Bitmap imageDrawable, String imageUrl) {
if(String.valueOf(imageDrawable).equals("null")){}
else{
img.setImageBitmap(imageDrawable);
}
}
});
img.setImageBitmap(cachedImage); 

Класс AsyncImageLoaderv находится здесь

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class AsyncImageLoaderv {
private HashMap<String, SoftReference<Bitmap>> imageCache;

public AsyncImageLoaderv() {
imageCache = new HashMap<String, SoftReference<Bitmap>>();
}

public Bitmap loadDrawable(final String imageUrl, final ImageCallback imageCallback) {

if (imageCache.containsKey(imageUrl)) {
SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
Bitmap drawable = softReference.get();
if (drawable != null) {
return drawable;
}
}

final Handler handler = new Handler() {

@Override
public void handleMessage(Message message) {
imageCallback.imageLoaded((Bitmap) message.obj, imageUrl);
}
};

new Thread() {
@Override
public void run() {
try{
Log.d("ur",imageUrl);
Bitmap drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Bitmap>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}catch(Exception e){Log.e("thread stellent",e.toString());}
}
}.start();
return null;
}

public static Bitmap loadImageFromUrl(String url) {
InputStream inputStream;Bitmap b;
try {
inputStream = (InputStream) new URL(url).getContent();
BitmapFactory.Options bpo=new BitmapFactory.Options();
bpo.inSampleSize=2;
//b=BitmapFactory.decodeStream(inputStream, null,bpo );
PatchInputStream patch=new PatchInputStream(inputStream);
b=BitmapFactory.decodeStream(patch);
return  b;
} catch (IOException e) {
throw new RuntimeException(e);
}

//return null;
}

public interface ImageCallback {
public void imageLoaded(Bitmap imageBitmap, String imageUrl);
}
}

class PatchInputStream extends FilterInputStream {
public PatchInputStream(InputStream in) {
super(in);
}

public long skip(long n) throws IOException {
long m = 0L;
while (m < n) {
long _m = in.skip(n-m);
if (_m == 0L) break;
m += _m;
}
return m;
}
}
...