Lancer OutOfMemoryError "pthread_create (pile de 1040 Ko) a échoué: réessayez" lors de l'exécution de publications asynchrones à l'aide de Volley
Je suis l'aide de Volley à afficher des données stockées dans une base de données locale à un serveur. Le problème est quand j'ai un grand nombre d'entrées (par exemple 500), j'obtiens cette erreur:
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)
C'est la façon dont je suis la récupération de données à partir du curseur et de faire le 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();
}
}
et c'est ma méthode qui ne l'après
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);
}
Ce travail est bien si j'ai 400 entrées dans les locaux de la db et après qu'il jette qui execption.
Je vous remercie à l'avance.
source d'informationauteur Adrian Antal
Vous devez vous connecter pour publier un commentaire.
Le problème est que j'ai été la création d'un nouveau RequestQueue pour chaque demande. C'est la raison pour laquelle je soupçonne que c'était jeter de l'Exception OutOfMemory. La solution est simple:
au lieu de
RequestQueue requestQueue = Volley.newRequestQueue(context);
déclarer la RequestQueue en dehors de la méthode et ajouter un nouveau RequestQueue que si le précédent est nulle.
Comme une note de côté, j'ai eu la même erreur de socket.io, à chaque fois que j'ai renoué des liens avec la prise.connect() nouveau thread serait de commencer avec de vieux thread en cours d'exécution.
Résolu en appelant le support.disconnect() avant la prise.connect(). Même si la socket est déjà déconnecté, appel socket.disconnect() va détruire de vieux thread pour vous
Il n'est pas réellement liée à la question elle-même, mais j'ai eu le même "outofmemoryerror pthread_create" erreur, ce qui n'est pas provoquée par le Volley mais par socket.io créer de nouvelles discussions à chaque fois que l'utilisateur essaie de se reconnecter manuellement (par l'appel socket.se connecter, au lieu de "reconnecter" option à true). Lorsque j'ai été googler pour la solution je suis venu à cette question et après avoir résolu le problème décidé d'ajouter la solution ici, juste au cas où quelqu'un d'autre avait le même problème