Выбрасывание OutOfMemoryError "pthread create (1040kb stack) не удалось: повторите попытку" при выполнении асинхронных сообщений с помощью Volley

Я использую 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 записей в локальной БД, и после этого он бросает это выполнение. Заранее спасибо.

2 ответов


проблема я создавал новый RequestQueue для каждого запроса. Вот почему я подозреваю, что это было исключение OutOfMemory. Решение простое:

вместо RequestQueue requestQueue = Volley.newRequestQueue(context);

объявите RequestQueue вне метода и добавьте новый RequestQueue, только если предыдущий равен 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....
}

в качестве примечания, у меня была та же ошибка из сокета.io, всякий раз, когда я подключался к сокету.connect () новый поток начнется со старого потока, который все еще работает.

решил его, вызвав сокет.отсоединить () перед разъемом.связываться.)( Несмотря на то, что socket уже отключен, вызывая socket.disconnect () уничтожит старую нить для вас

на самом деле это не связано с самим вопросом, но у меня была такая же ошибка "outofmemoryerror pthread_create", которая не вызвана залпом, но сокетом.io создает новые потоки каждый раз, когда пользователь пытается подключиться вручную (вызывая сокет.connect, вместо установки опции "reconnect" в true). Когда я искал решение, я пришел к этому вопросу и после исправления проблемы решил добавить решение здесь, на случай, если у кого-то еще была такая же проблема