2016-02-29 7 views
15

Używam Volley do POST niektóre dane przechowywane w lokalnej bazie danych na serwerze. Problem jest, gdy mam dużą liczbę wpisów (na przykład 500), otrzymuję ten błąd:Throwing OutOfMemoryError "pthread_create (stos 1040 KB) nie powiodło się: spróbuj ponownie" podczas wykonywania asynchronicznych wiadomości za pomocą Volley

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) 

to jak mam pobierania danych z kursora i robi stanowisko

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(); 
    } 
} 

i to jest moja metoda, która robi 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); 

} 

to działa dobrze, jeśli mam 400 wpisów w lokalnym db, a potem rzuca że execption. Z góry dziękuję.

Odpowiedz

28

Problem polega na tym, że podczas każdego żądania tworzyłem nową wartość RequestQueue. Z tego powodu podejrzewam, że rzucił wyjątek OutOfMemory. Rozwiązanie jest proste:

zamiast RequestQueue requestQueue = Volley.newRequestQueue(context);

zadeklarować RequestQueue poza metody i dodać nowy RequestQueue tylko wtedy, gdy poprzedni jest 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.... 
} 
+0

Naprawiono problem. Dzięki ! –

+0

Dzięki .... Pracuje dla mnie – VVB

3

Na marginesie, miałem ten sam błąd z socket.io, ilekroć ponownie połączone z Socket.connect() nowy wątek ruszy z stary wątek nadal działa.

Rozwiązano, wywołując socket.disconnect() przed socket.connect(). Mimo że gniazdo jest już odłączone, wywołanie socket.disconnect() zniszczy stary wątek dla ciebie

Nie jest to właściwie związane z samym pytaniem, ale miałem ten sam błąd "outofmemoryerror pthread_create", który nie jest spowodowany przez Volley ale przez socket.io tworzenie nowych wątków za każdym razem, gdy użytkownik próbuje ponownie połączyć się ręcznie (przez wywołanie socket.connect, zamiast ustawienia opcji "reconnect" na true). Kiedy szukałem rozwiązania w wyszukiwarce, doszedłem do tego pytania i po naprawieniu problemu postanowiłem dodać tutaj rozwiązanie, na wypadek gdyby ktoś inny miał ten sam problem.

+0

czy możesz wyjaśnić to bardziej szczegółowo jako związane z pytaniem :)? – wahwahwah

+0

Nie jest to właściwie związane z samym pytaniem, ale miałem ten sam błąd "outofmemoryerror pthread_create", który nie jest spowodowany przez Volley, ale przez socket.io tworzenie nowych wątków za każdym razem, gdy użytkownik próbuje ponownie połączyć się ręcznie (przez wywołanie socket.connect zamiast ustawiania opcji "reconnect" na true). Kiedy szukałem rozwiązania w wyszukiwarce, doszedłem do tego pytania i po naprawieniu problemu postanowiłem dodać tutaj rozwiązanie, na wypadek gdyby ktoś inny miał ten sam problem – Alatoo

+0

proszę to w swojej odpowiedzi ... – wahwahwah

Powiązane problemy