La mia app scarica dati da un server PHP utilizzando thread da un ExecutorService con dimensione ThreadPool 4. Nell'API 27, l'app funziona perfettamente senza causare alcuna eccezione OOM dalla memoria Heap. Ma tutte le API precedenti < 26 lancia OOM.
Di seguito è riportato un semplice esempio di codice che esegue 134 richieste e quindi aggiunge la risposta al pool. Nella API 27 la dimensione massima dell'Heap raggiunge i 68 mb. Ma quando lo eseguo con API 19,21,25 e.t.c, la dimensione massima dell'heap raggiunge 123 mb.
Quando rimuovo il Log.d ("Process response", (response) + ""); nell'API 27 la dimensione dell'heap scende a 10mb. Ma con l'API 19, la dimensione dell'heap va a 60mb.
Non capisco perché raddoppia le dimensioni. Sembra che nell'API 19 e oltre aumenti la memoria quando si aggiungono attività nel pool e anche quando si tiene il riferimento nella variabile di risposta.
Qualche suggerimento?
Nota Il thread sleep è solo per l'esempio per vedere la dimensione massima dell'heap
Grazie
private ActivityManager activityManager;
ExecutorService service = Executors.newFixedThreadPool(4);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activityManager= (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);;
final RequestQueue queue = Volley.newRequestQueue(this);
String url =".....";
for(int i =0 ; i<134 ; i++) {
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
method(response); //0.5mb
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("VolleyError", error.toString());
}
});
queue.add(stringRequest);
}
}
public void method(final String response){
Runnable task = new Runnable() {
@Override
public void run() {
try {
Log.d("Process response", (response)+"");
Thread.sleep(200000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
logHeap("");
service.execute(task);
}