我使用Volley将存储在本地数据库中的一些数据发送到服务器。问题是,当我有大量条目(例如500)时,我收到此错误:
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)
这就是我从光标检索数据并执行帖子
的方法 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();
}
}
这是我执行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);
}
如果我在本地数据库中有400个条目并且之后它会抛出该execption,那么它的工作正常。 提前谢谢。
答案 0 :(得分:42)
问题是我正在为每个请求创建一个新的RequestQueue。这就是我怀疑它抛出OutOfMemory Exception的原因。解决方案很简单:
而不是RequestQueue requestQueue = Volley.newRequestQueue(context);
在方法外声明RequestQueue,并且仅当前一个RequestQueue为空时才添加新的RequestQueue。
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....
}
答案 1 :(得分:6)
作为旁注,我在socket.io中遇到了同样的错误,每当我重新连接socket.connect()时,新线程都会以旧线程仍然运行开始。
通过在socket.connect()之前调用socket.disconnect()来解决它。即使socket已经断开连接,调用socket.disconnect()也会为你破坏旧线程
它实际上与问题本身无关,但我有同样的“outofmemoryerror pthread_create”错误,这不是由Volley引起的,而是由socket.io每次用户尝试手动重新连接时创建新线程(通过调用socket .connect,而不是将“reconnect”选项设置为true)。当我在谷歌搜索解决方案时,我来到这个问题,在解决问题后决定在这里添加解决方案,以防其他人遇到同样的问题
答案 2 :(得分:0)
我可能在这里迟到了。
当不必要地添加新的RequestQueue
时,就会出现问题,它只会占用大量内存。
诀窍是检查requestqueue是否为null,如果是,则创建一个新请求,或者是否已经存在,只需将其添加到现有请求中即可。
在您的代码中,执行以下操作:
private RequestQueue requestQueue;// Declare
//In your Volley Call Method
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(this);
requestQueue.add(jsArrRequest);
} else {
requestQueue.add(jsArrRequest);
}