Android Volley给我一个outOfMemoryexception

我使用齐射显示从服务器的水平滑动视图中的图像,但我的图像是相当大的,这就是我得到一个例外的内存不足

以下是我的排球课:

public class Volley{ private RequestQueue mRequestQueue; private ImageLoader mImageLoader; public Volley(Context ctx) { Log.v("Volley", "Volley onCreate"); mRequestQueue = com.android.volley.toolbox.Volley.newRequestQueue(ctx); final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() { LruCache<String, Bitmap> imageCache = new LruCache<String, Bitmap>(cacheSize); @Override public void putBitmap(String key, Bitmap value) { imageCache.put(key, value); } @Override public Bitmap getBitmap(String key) { return imageCache.get(key); } }; mImageLoader = new ImageLoader(mRequestQueue, imageCache); } public void clear(Context ctx) { mRequestQueue.cancelAll(ctx); mImageLoader = null; mRequestQueue = null; } public RequestQueue getRequestQueue() { return mRequestQueue; } public ImageLoader getImageLoader() { return mImageLoader; }} 

图像加载器代码:

 image.setImageUrl(imagePhoto.url, getVolley(getContext()).getImageLoader()); public Volley getVolley(Context ctx) { if(mVolley == null) { mVolley = new Volley(getContext()); } return mVolley; } 

例外:

 > 06-10 22:14:27.462: E/AndroidRuntime(10060): FATAL EXCEPTION: Thread-29479 06-10 22:14:27.462: E/AndroidRuntime(10060): java.lang.OutOfMemoryError 06-10 22:14:27.462: E/AndroidRuntime(10060): at com.android.volley.toolbox.ByteArrayPool.getBuf(ByteArrayPool.java:101) 06-10 22:14:27.462: E/AndroidRuntime(10060): at com.android.volley.toolbox.PoolingByteArrayOutputStream.<init>(PoolingByteArrayOutputStream.java:53) 06-10 22:14:27.462: E/AndroidRuntime(10060): at com.android.volley.toolbox.BasicNetwork.entityToBytes(BasicNetwork.java:202) 06-10 22:14:27.462: E/AndroidRuntime(10060): at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:104) 06-10 22:14:27.462: E/AndroidRuntime(10060): at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105) 

Solutions Collecting From Web of "Android Volley给我一个outOfMemoryexception"

我没有解决这个问题,以提供caching到LruCache的BitmapLruCache

 public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache { public static int getDefaultLruCacheSize() { final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; return cacheSize; } public BitmapLruCache() { this(getDefaultLruCacheSize()); } public BitmapLruCache(int sizeInKiloBytes) { super(sizeInKiloBytes); } @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight() / 1024; } @Override public Bitmap getBitmap(String url) { return get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { put(url, bitmap); } 

}

这里是链接: Android Volley ImageLoader – BitmapLruCache参数?

我不知道你的ImageLoader是如何实现的,但它可能会加载一个Bitmap。 尝试在生成位图时将以下BitmapOption:inPurgeable设置为true。 这样,当内存不足时,位图内存将被清除。

看看这个问题: 为什么我不使用BitmapFactory的inPurgeable选项?

我不知道你是如何实施滑动视图。 但是在大多数的实现中(比如viewpager),它会caching3个或者更多的项目。 所以你并不需要提供LRUCache来抽象。

只要删除imageCache的代码,你会看到内存使用情况的改善。