Volley library getting out of memory error

前端 未结 4 1589
没有蜡笔的小新
没有蜡笔的小新 2020-12-19 17:56
java.lang.OutOfMemoryError: Failed to allocate a 1465140570 byte allocation with 1622964 free bytes and 509MB until OOM
    at com.android.volley.toolbox.DiskBasedCa         


        
4条回答
  •  天命终不由人
    2020-12-19 18:41

    I found this help, I'm testing It, when I finish, I will come here to write if It works


    update

    Well I tested It with an infinite 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() {//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,//tries 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

    Test 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() {//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,//tries 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 do not call newRequestQueue more than one time... you will get error of out memory or OOM error.

    More links for reference 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

提交回复
热议问题