android - studio - El lanzamiento de OutOfMemoryError "pthread_create(pila de 1040KB) falló: inténtelo de nuevo" al hacer publicaciones asíncronas utilizando Volley
volley android implementation (2)
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 antiguo aún en ejecución.
Se solucionó llamando a socket.disconnect () antes de socket.connect (). Aunque el socket ya está desconectado, al llamar a socket.disconnect () se destruirá el subproceso antiguo por ti
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 volver a conectarse manualmente (llamando a socket.connect, en lugar de configurar la opción "reconectar" en verdadero). Cuando buscaba en Google la solución, llegué a esta pregunta y, después de solucionar el problema, decidí agregar la solución aquí, en caso de que alguien más tuviera el mismo problema.
Estoy usando Volley para POST algunos datos almacenados en una base de datos local a un servidor. El problema es que cuando tengo una gran cantidad de entradas (por ejemplo, 500) recibo 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 la base de datos local y después de eso lanza esa excepción. Gracias de antemano.
El problema es que estaba creando un nuevo RequestQueue para cada solicitud. Esa es la razón por la que sospecho que estaba lanzando 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....
}