I'm using Volley to POST some data stored in a local database to a server. The problem is when I have a big number of entries (for example 500) I get this 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)
This is how I'm retrieving data from the cursor and doing the post
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();
}
}
and this is my method that does the 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);
}
It work's fine if I've got 400 entries in the local db and after that it throws that execption. Thank you in advance.
The problem is I was creating a new RequestQueue for every request. That's the reason I suspect it was throwing the OutOfMemory Exception. The solution is simple:
instead of RequestQueue requestQueue = Volley.newRequestQueue(context);
declare the RequestQueue outside the method and add a new RequestQueue only if the previous one is null.
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....
}
As a side note, I had the same error from socket.io, whenever I reconnected with socket.connect() new thread would start with old thread still running.
Solved it by calling socket.disconnect() before socket.connect(). Even though socket is already disconnected, calling socket.disconnect() will destroy old thread for you
It is not actually related to the question itself, but I had the same "outofmemoryerror pthread_create" error, which isn't caused by Volley but by socket.io creating new threads every time user tries to reconnect manually (by calling socket.connect, instead of setting "reconnect" option to true). When I was googling for the solution I came to this question and after fixing the problem decided to add the solution here, just in case someone else had the same problem
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With