Pregunta Throwing OutOfMemoryError "pthread_create (stack 1040KB) failed: Try again" cuando se realizan publicaciones asincrónicas con Volley


Estoy usando Volley para enviar algunos datos almacenados en una base de datos local a un servidor. El problema es cuando tengo un gran número de entradas (por ejemplo, 500) Obtengo este error:

 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)

Así es como estoy recuperando datos del cursor y haciendo la publicación

    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();
    }
}

y este es mi método que hace el 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);

}

Funciona bien si tengo 400 entradas en el archivo db local y luego lanza esa excepción. Gracias de antemano.


16
2018-02-29 13:59


origen


Respuestas:


El problema es que estaba creando un nuevo RequestQueue para cada solicitud. Esa es la razón por la que sospecho que arrojaba la excepción OutOfMemory. La solución es simple:

en lugar de RequestQueue requestQueue = Volley.newRequestQueue(context);

declare el RequestQueue fuera del método y agregue un nuevo RequestQueue solo si el anterior es nulo.

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....
}

31
2018-03-01 08:57



Como nota al margen, tuve el mismo error de socket.io, cada vez que me volví a conectar con socket.connect () el nuevo hilo comenzaría con el hilo viejo aún ejecutándose.

Lo resolvió llamando a socket.disconnect () antes de socket.connect (). Aunque el socket ya está desconectado, al llamar a socket.disconnect () destruirá el hilo viejo por usted

En realidad, no está relacionado con la pregunta en sí, pero tuve el mismo error "outofmemoryerror pthread_create", que no es causado por Volley sino por socket.io creando nuevos subprocesos cada vez que el usuario intenta reconectarse manualmente (llamando a socket.connect, en lugar de configurar la opción "reconectar" a verdadero). Cuando busqué la solución en Google, llegué a esta pregunta y después de solucionar el problema decidí agregar la solución aquí, por si acaso alguien tenía el mismo problema.


3
2018-03-02 05:51