2016-02-29 24 views
15

Sto utilizzando Volley per POST alcuni dati memorizzati in un database locale su un server. Il problema è quando ho un grande numero di voci (ad esempio 500) ottengo questo errore:Lancio OutOfMemoryError "pthread_create (stack 1040KB) non riuscito: riprovare" quando si fanno post asincroni usando Volley

java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again 
at java.lang.Thread.nativeCreate(Native Method) 
at com.android.volley.RequestQueue.start(RequestQueue.java:141) 
at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:66) 
at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:66) 
at mypackageName.SomeClass.upload(SomeClass) 
at mypackageName.MyClass$MyThred.run(SomeClass.java:387) 

Questo è come mi sto il recupero dei dati dal cursore e facendo il palo

private class UploadDataThred extends Thread { 

    @Override 
    public void run() { 
     SomeSQLiteHelper someSQLiteHelper = new SomeSQLiteHelper(context); 
     someSQLiteHelper.getWritableDatabase(); 
     Cursor result = someSQLiteHelper.getAllEvents(); 
     DataUploader dataUploader = new DataUploader(context); 

     while (result.moveToNext()) { 
      Build.logError("We're looping!"); 
      while (!waitingForResponse) { 
       try { 
        Thread.sleep(4000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      } 
      dataUploader.upload(result.getString(0), false, result.getString(1), result.getString(2), result.getString(3), result.getString(4), result.getString(5), result.getString(6), result.getString(7), result.getString(8)); 

     } 
     someSQLiteHelper.close(); 
    } 
} 

e questo è il mio metodo che fa il POST

public void upload(Some parameters go here) { 

    waitingForResponse = true; 
    VolleyLog.DEBUG = false; 


    final JSONObject o = new JSONObject(); 
    o.put(Some data) 

    RequestQueue requestQueue = Volley.newRequestQueue(context); 

    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, HOST, o, new Response.Listener<JSONObject>() { 


     @Override 
     public void onResponse(JSONObject response) { 

      if (response.toString().contains("OK")) { 

       if (columnID != null) { 

       deleteSingleEntry(columnID); 

       } 


       waitingForResponse = false; 


      } 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

      waitingForResponse = false; 

     } 
    }) { 

     /** 
     * Passing some request headers 
     * */ 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-Type", "application/json; charset=utf-8"); 
      return headers; 
     } 


    }; 



    requestQueue.add(jsonObjReq); 

} 

di lavoro e 'bene se ho 400 voci nel db locale e dopo che getta che execption. Grazie in anticipo.

risposta

28

Il problema è che stavo creando un nuovo RequestQueue per ogni richiesta. Questo è il motivo per cui sospetto che stia lanciando l'eccezione OutOfMemory. La soluzione è semplice:

anziché RequestQueue requestQueue = Volley.newRequestQueue(context);

dichiarare il RequestQueue fuori del metodo e aggiungere un nuovo RequestQueue solo se il precedente è nullo.

private RequestQueue requestQueue; 

public void uploadData(String s) { 
if (requestQueue == null) { 
     requestQueue = Volley.newRequestQueue(context); 
     Build.logError("Setting a new request queue"); 
    } more request stuff.... 
} 
+0

Risolto il problema. Grazie ! –

+0

Grazie .... Funziona per me – VVB

3

Come nota laterale, ho avuto lo stesso errore da socket.io, ogni volta che ricollegato con Socket.connect() nuovo thread inizierebbe con il vecchio filo ancora in esecuzione.

Risolto chiamando socket.disconnect() prima di socket.connect(). Anche se il socket è già disconnesso, chiamando socket.disconnect() distruggerà il thread precedente per te

Non è in realtà correlato alla domanda stessa, ma ho avuto lo stesso errore "outofmemoryerror pthread_create", che non è causato da Volley ma tramite socket.io crea nuovi thread ogni volta che l'utente tenta di riconnettersi manualmente (chiamando socket.connect, invece di impostare l'opzione "riconnetti" su true). Quando ho cercato su google la soluzione sono arrivato a questa domanda e dopo aver risolto il problema ho deciso di aggiungere la soluzione qui, nel caso in cui qualcun altro avesse avuto lo stesso problema

+0

puoi spiegarlo più dettagliatamente in relazione alla domanda :)? – wahwahwah

+0

Non è in realtà correlato alla domanda stessa, ma ho avuto lo stesso errore "outofmemoryerror pthread_create", che non è causato da Volley ma da socket.io che crea nuovi thread ogni volta che l'utente tenta di riconnettersi manualmente (chiamando socket.connect , invece di impostare l'opzione "riconnetti" su true). Quando ho cercato su google la soluzione sono arrivato a questa domanda e dopo aver risolto il problema ho deciso di aggiungere la soluzione qui, nel caso in cui qualcun altro avesse lo stesso problema – Alatoo

+0

per favore mettilo nella risposta ... – wahwahwah