2011-07-29 17 views
0

私は、潜在的に多くのビットマップをScrollViewに読み込むことができるアプリケーションに取り組んでいます。しかし、ある時点では、ビットマップが多すぎるだけで、アプリは「メモリ不足」というエラーでクラッシュします。私はHoneycombでlargeHeapオプションを使用しています。多くのビットマップでメモリ使用量を最適化するにはどうすればよいですか?

ヒープサイズをさらに拡大したり、OpenGLを使用してこの問題を解決することはどういうことですか?ありがとう。

答えて

1

であることが見えたが、画像をロードすることによって、問題を解決することがありますARGB888ビットマップで使用されるメモリを減らすため、ScrollViewの代わりにギャラリービューを使用することにしました。これは、メモリ管理の方がはるかに優れています。なぜ私は最初にやっていないのだろうと思っている人たちのために、ScrollViewは私の意見ではもっと冷静に見えますが、私はGallery Viewのセンター全体を整列させるのが大好きではありませんが、それと一緒に暮らす。ありがとう!

1

あなたは

使用Asychronously画像を設定するには、このコード

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; 
} 
} 
+0

こんにちは、あなたの提案に感謝します。問題はローディングではなく、画像がすべてヒープにロードされたという事実でした。私は以前のソリューションとほぼ同じくらい良いギャラリービューを使ってこの問題を解決しましたが、メモリに関してははるかに優れています。 –

関連する問題