Volley library getting out of memory error

为君一笑 提交于 2019-12-18 07:06:30

问题


java.lang.OutOfMemoryError: Failed to allocate a 1465140570 byte allocation with 1622964 free bytes and 509MB until OOM
    at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:316)
    at com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526)
    at com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:548)
    at com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:392)
    at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155)
    at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:85)

回答1:


I found this help, i'm testing it, when i finish, i will come here to write if it work


update

Well i teste it with a cycle

like this

//global var 
Boolean running = true;
Thread MyThread = new Thread(){//create thread
    @Override
    public void run() {
    RequestQueue queue = Volley.newRequestQueue(MyActivity.this);// start one time no more...
    String url = "http://192.168.1.78/testget.php?key=123456789"; // my url

    // Request a string response from the provided URL.
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {//where request return ...
                @Override
                public void onResponse(String response) {
                    System.out.println("Volley response: \"" + response +"\"");
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            System.out.println("There is an error: "+error.getMessage()); // on error, ex: url bad... internet down, etc..
        }
    });
    stringRequest.setShouldCache(false);// no caching url...
    stringRequest.setRetryPolicy(
            new DefaultRetryPolicy(
                    20000,//time to wait for it in this case 20s
                    20,//tryies in case of error
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
            )
    );


        int i=0;
        while(running){

            System.out.println("counter: "+i);
            i++;

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                //e.printStackTrace();
                System.out.println("Sleep interrupted");
            }

            // Add the request to the RequestQueue.
            queue.add(stringRequest);
        }
        System.out.println("onEnd Thread");
    }
};
MyThread.start(); // start thread

//in some button declare 
running=false;

I tested it 130144 times ~ 18.07 hr, without any error

System.out: Counter: 130141
System.out: Volley response: "something"
System.out: Counter: 130142
System.out: Volley response: "something"
System.out: Counter: 130143
System.out: Volley response: "something"
System.out: Counter: 130144

Getting Error with call newRequestQueue more than one time

Teste with RequestQueue queue = Volley.newRequestQueue(MyActivity.this); calling more than one time

example

//global var 
Boolean running = true;

Thread MyThread = new Thread(){//create thread

    void getSomethingFromSite(){

        RequestQueue queue = Volley.newRequestQueue(MyActivity.this);//calling request more than one time... error you not call more than one time
        String url = "http://192.168.1.78/testget.php?key=123456789"; // my url

        // Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {//where request return ...
                @Override
                public void onResponse(String response) {
                    System.out.println("Volley response: \"" + response +"\"");
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    System.out.println("There is an error: "+error.getMessage()); // on error, ex: url bad... internet down, etc..
            }
        });
        stringRequest.setShouldCache(false);// no caching url...
        stringRequest.setRetryPolicy(
                new DefaultRetryPolicy(
                        20000,//time to wait for it in this case 20s
                        20,//tryies in case of error
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
                )
        );
        // Add the request to the RequestQueue.
        queue.add(stringRequest);
    }

    @Override
    public void run() {

        int i=0;
        while(running){

            System.out.println("counter: "+i);
            i++;

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                //e.printStackTrace();
                System.out.println("Sleep interrupted");
            }
            //call volley 
            getSomethingFromSite();
        }
        System.out.println("onEnd Thread");
    }
};
MyThread.start(); // start thread

//in some button declare 
running false;

Erro with 475 times

I/System.out: Counter: 471
I/System.out: Volley response: "Something"
W/libc: pthread_create failed: couldn't allocate 1064960-byte stack: Out of memory
E/art: Throwing OutOfMemoryError "pthread_create (1040KB stack) failed: Try again"
       --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: Thread-373
  Process: com.masm.testservice, PID: 3821
  java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
      at java.lang.Thread.nativeCreate(Native Method)
      at java.lang.Thread.start(Thread.java:1063)
      at com.android.volley.RequestQueue.start(RequestQueue.java:152)
      at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:66)
      at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78)
      at com.masm.testservice.MyService$1.getDataVolley(MyService.java:84)
      at com.masm.testservice.MyService$1.run(MyService.java:129)
E/AndroidRuntime: Error reporting crash
    java.lang.OutOfMemoryError
        at android.os.Parcel.nativeWriteString(Native Method)
        at android.os.Parcel.writeString(Parcel.java:536)
        at android.app.ApplicationErrorReport$CrashInfo.writeToParcel(ApplicationErrorReport.java:389)
        at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4099)
        at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:89)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

Conclusion

You don't not call newRequestQueue more than one time... you will get error of out memory or OOM error.

More links for referense or information:
1.- Out of memory error when use volley library
2.- Volley give me Out of memory exception after I make a lot of request with big amount of data
3.- Volley slow and causing memory leak
4.- Volley framewok request keeps objects in memory




回答2:


If anyone still encounters this issue, it was fixed on volley version 1.1.0-rc1

Just upgrade to this version.




回答3:


OutOfMemoryError occurs when you try to load large data into your app's memory that exceeds the available RAM. I do not know what you are using volley for at the moment but try disabling cache for volley see here or not load a huge file at once or try compressing the file. It would help if you give more detail on what you are trying to achieve and the code section that is causing the error.




回答4:


This is thrown while trying to read the header, which should be comparatively small. Note as well that the DiskBasedCache size is only 5MB.

See https://stackoverflow.com/a/42196956/901597



来源:https://stackoverflow.com/questions/38206161/volley-library-getting-out-of-memory-error

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