Android Volley give me an outOfMemory exception

匿名 (未验证) 提交于 2019-12-03 01:48:02

问题:

I am using volley to showing images in horizontal swipe view from the server, but my images are quite large that's way i am getting an exception of out of memory

Below is my volley class:

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 imageCache = new LruCache(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 loader code:

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

Exception:

> 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.(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) 

回答1:

i did fix this to provide proper cache to the BitmapLruCache insted of LruCache

public class BitmapLruCache extends LruCache 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); } 

}

here is the link: Android Volley ImageLoader - BitmapLruCache parameter?



回答2:

I don't know how your ImageLoader is implemented, but it probably loads a Bitmap. Try to set the following BitmapOption: inPurgeable to true while generating the bitmap. That way, the bitmap memory will be cleaned when you are getting low on memory.

Look at this question: Why would I ever NOT use BitmapFactory's inPurgeable option?



回答3:

I am not sure how you implemented swipe view. But in most implementations (like viewpager) it will cache 3 or more items. So you don't really need to provide the LRUCache to volley.

Just remove the code for imageCache and you will see improvements in memory usage.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!